Demographics
# total n
d %>%
select(ageGroup, subid, age) %>%
distinct(.keep_all = T) %>%
mutate(ageGroup2 = ifelse(ageGroup == "adult",
"adult",
ifelse(age < 7 | age > 10,
"out of age range",
ifelse(is.na(age),
"missing age",
"child")))) %>%
count(ageGroup2)
# drop children outside of target age range (7-9y)
d1 <- d %>%
filter((age >= 7 & age <= 10) | ageGroup == "adult")
d1 %>%
select(ageGroup, subid, age) %>%
distinct(.keep_all = T) %>%
mutate(ageGroup2 = ifelse(ageGroup == "adult",
"adult",
ifelse(age < 7 | age > 10,
"out of age range",
ifelse(is.na(age),
"missing age",
"child")))) %>%
count(ageGroup2)
# condition
d1 %>%
select(ageGroup, subid, character) %>%
distinct(.keep_all = T) %>%
count(ageGroup, character)
# age
d1 %>%
select(ageGroup, subid, age) %>%
distinct(.keep_all = T) %>%
group_by(ageGroup) %>%
summarise(mean_age = mean(age, na.rm = T),
sd_age = sd(age, na.rm = T),
median_age = median(age, na.rm = T),
min_age = min(age, na.rm = T),
max_age = max(age, na.rm = T))
# plot children's age
qplot(d1 %>%
filter(ageGroup == "child") %>%
distinct(subid, .keep_all = T) %>%
select(age), bins = 18) +
geom_vline(xintercept = median(d1$age[d1$ageGroup == "child"], na.rm = T), color = "red")

# check children's age by condition
d1 %>%
filter(ageGroup == "child") %>%
distinct(subid, .keep_all = T) %>%
select(age, character) %>%
group_by(character) %>%
summarise(median = median(age, na.rm = T))
t.test(age ~ character,
d1 %>%
filter(ageGroup == "child") %>%
select(subid, age, character) %>%
distinct)
Welch Two Sample t-test
data: age by character
t = 0.48254, df = 197.76, p-value = 0.63
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.1769700 0.2916335
sample estimates:
mean in group beetle mean in group robot
8.381464 8.324132
ggplot(d1 %>%
filter(ageGroup == "child") %>%
distinct(subid, .keep_all = T) %>%
select(age, character) %>%
group_by(character) %>%
mutate(median_age = median(age, na.rm = T)),
aes(x = age)) +
geom_histogram(bins = 9) +
facet_wrap(~ character) +
geom_vline(xintercept = median(d$age[d$ageGroup == "child"], na.rm = T), color = "black") +
geom_vline(aes(xintercept = median_age, color = character), lty = 2)

# duration
d1 %>%
group_by(ageGroup) %>%
summarise(mean = mean(sessionDuration, na.rm = T),
median = median(sessionDuration, na.rm = T),
min = min(sessionDuration, na.rm = T),
max = max(sessionDuration, na.rm = T))
# plot duration by age group and character
ggplot(d1, aes(sessionDuration)) +
facet_grid(character ~ ageGroup) +
geom_histogram(breaks = 0:15)

t.test(sessionDuration ~ character,
d1 %>%
filter(ageGroup == "child") %>%
select(subid, character, sessionDuration) %>%
left_join(d %>% select(subid, sessionDuration)) %>%
mutate(subid = as.character(subid),
character = factor(character),
sessionDuration = round(as.numeric(as.character(sessionDuration)), 3)) %>%
distinct())
Joining, by = c("subid", "sessionDuration")
Joining, by = c("subid", "sessionDuration")
Welch Two Sample t-test
data: sessionDuration by character
t = -0.38762, df = 149.35, p-value = 0.6988
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.5105418 0.3430885
sample estimates:
mean in group beetle mean in group robot
5.293337 5.377063
t.test(sessionDuration ~ character,
d1 %>%
filter(ageGroup == "adult") %>%
select(subid, character, sessionDuration) %>%
left_join(d %>% select(subid, sessionDuration)) %>%
mutate(subid = as.character(subid),
character = factor(character),
sessionDuration = round(as.numeric(as.character(sessionDuration)), 3)) %>%
distinct())
Joining, by = c("subid", "sessionDuration")
Joining, by = c("subid", "sessionDuration")
Welch Two Sample t-test
data: sessionDuration by character
t = 0.76334, df = 186.45, p-value = 0.4462
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.2954407 0.6683779
sample estimates:
mean in group beetle mean in group robot
2.963449 2.776980
# gender
d1 %>%
select(ageGroup, subid, gender) %>%
distinct(.keep_all = T) %>%
count(ageGroup, gender)
# ethnicity
d1 %>%
select(ageGroup, subid, ethnicity) %>%
mutate(ethnicity = tolower(ethnicity)) %>%
mutate(black = grepl("black", ethnicity) |
grepl("african american", ethnicity),
east_asian = grepl("east asian", ethnicity) |
grepl("eastasian", ethnicity) |
grepl("chinese", ethnicity) |
grepl("china", ethnicity) |
grepl("korea", ethnicity) |
grepl("japan", ethnicity) |
grepl("taiwan", ethnicity),
south_asian = grepl("south asian", ethnicity) |
grepl("southasian", ethnicity) |
grepl("india", ethnicity) |
grepl("pakistan", ethnicity) |
grepl("bangla", ethnicity) |
grepl("sri lanka", ethnicity),
latino = grepl("latin", ethnicity) |
grepl("hispanic", ethnicity) |
grepl("mexic", ethnicity),
middle_eastern = grepl("middle", ethnicity),
pac_island = grepl("pacific", ethnicity) |
grepl("hawaii", ethnicity),
native_am = grepl("nativeamerican", ethnicity) |
grepl("native american", ethnicity) |
grepl("american indian", ethnicity) |
grepl("alaska native", ethnicity),
white = grepl("white", ethnicity),
other = grepl("other", ethnicity)) %>%
distinct(.keep_all = T) %>%
gather(ethnicityTF, TF, -subid, -ethnicity, -ageGroup) %>%
filter(TF) %>%
count(ageGroup, ethnicityTF)
# NOTE: not mutually exclusive!!
# mutually exclusive version
d1 %>%
select(ageGroup, subid, ethnicity) %>%
mutate(ethnicity = tolower(ethnicity)) %>%
distinct(.keep_all = T) %>%
mutate(ethnicity2 = ifelse(ageGroup == "adult",
ifelse(grepl(",", ethnicity), "multiple", ethnicity),
ifelse(grepl(";", ethnicity), "multiple", ethnicity))) %>%
mutate(ethnicity3 = ifelse(grepl("other", ethnicity2),
ifelse(grepl("/", ethnicity2) | grepl("mix", ethnicity2),
"multiple",
ifelse(grepl("asian", ethnicity2) | grepl("korean", ethnicity2),
"east asian",
ethnicity2)),
ethnicity2)) %>%
count(ageGroup, ethnicity3) %>%
ungroup() %>%
group_by(ageGroup) %>%
mutate(prop = n/sum(n)) %>%
arrange(ageGroup, desc(n))
# experimineter error
d_child01 %>% # use d_child01 (before dropping n = 1 child in "elephant" condition)
filter(!(character %in% c("beetle", "robot"))) %>%
select(subid) %>%
distinct() %>%
count() %>%
mutate(percent = n/200)
# incomplete trials ("skip", "bail")
d1 %>% # use d1 (before dropping trials with rt > 250ms)
count(ageGroup, subid) %>%
filter(n != 40) %>%
mutate(n_missing = 40-n) %>%
group_by(ageGroup) %>%
summarise(sum_missing = sum(n_missing)) %>%
mutate(percent = sum_missing/8000)
# trials with rt > 250ms
d1 %>%
filter(rt < 250) %>%
count(ageGroup) %>%
mutate(percent = n/8000)
# all missing trials
d1 %>% # use d1 (before dropping trials)
count(ageGroup, subid) %>%
filter(n != 40) %>%
mutate(n_NA = 40-n) %>%
group_by(ageGroup) %>%
summarise(n_NA = sum(n_NA)) %>%
mutate(percent_NA = n_NA/8000) %>%
full_join(d1 %>%
filter(rt < 250) %>%
count(ageGroup) %>%
rename(n_fast = n) %>%
mutate(percent_fast = n_fast/8000)) %>%
mutate(n_missing_TOTAL = n_NA + n_fast,
percent_missing_TOTAL = percent_NA + percent_fast)
Joining, by = "ageGroup"
NA
Regression on factor scores
Children vs. adults
scores_all <- fa(d3_combined, nfactors = efa_comb_max_unrot_nfactors, rotate = rot_type,
cor = cor_type, scores = score_type)$scores %>%
data.frame() %>%
rownames_to_column(var = "subid") %>%
mutate(ageGroup = factor(ifelse(grepl("run", subid), "adult", "child")))
colnames(scores_all)[2:4] <- c("score_F1", "score_F2", "score_F3")
# analyze
scores_all_analysis <- d %>%
select(subid, ageGroup, character) %>%
distinct() %>%
left_join(scores_all) %>%
mutate(character = factor(character)) %>%
filter(!is.na(score_F1) & !is.na(score_F2) & !is.na(score_F3), !is.na(ageGroup)) %>%
gather(factor, score, starts_with("score_")) %>%
mutate(factor = factor(factor))
Joining, by = c("subid", "ageGroup")
joining character vector and factor, coercing into character vector
# set contrasts
contrasts(scores_all_analysis$factor) <- cbind(F1 = c(1, -1, 0), # MAKE SURE TO DOUBLE-CHECK!!
F3 = c(0, -1, 1))
contrasts(scores_all_analysis$character) <- cbind(robot = c(-1, 1))
contrasts(scores_all_analysis$ageGroup) <- cbind(child = c(-1, 1))
r1 <- lmer(score ~ character * factor + (1 | subid), scores_all_analysis)
r2 <- lmer(score ~ character * factor + ageGroup + (1 | subid), scores_all_analysis)
r3 <- lmer(score ~ character * factor * ageGroup + (1 | subid), scores_all_analysis)
anova(r1, r2, r3)
refitting model(s) with ML (instead of REML)
Data: scores_all_analysis
Models:
r1: score ~ character * factor + (1 | subid)
r2: score ~ character * factor + ageGroup + (1 | subid)
r3: score ~ character * factor * ageGroup + (1 | subid)
Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)
r1 8 2640.6 2680.8 -1312.3 2624.6
r2 9 2557.5 2602.7 -1269.8 2539.5 85.129 1 < 2.2e-16 ***
r3 14 2380.1 2450.5 -1176.1 2352.1 187.387 5 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# summary(r1)
# summary(r2)
summary(r3)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ character * factor * ageGroup + (1 | subid)
Data: scores_all_analysis
REML criterion at convergence: 2418.9
Scaled residuals:
Min 1Q Median 3Q Max
-4.5185 -0.4598 0.0316 0.5694 2.7240
Random effects:
Groups Name Variance Std.Dev.
subid (Intercept) 0.1435 0.3789
Residual 0.3703 0.6085
Number of obs: 1125, groups: subid, 375
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.007703 0.026702 -0.288
characterrobot -0.280088 0.026702 -10.490
factorF1 -0.002132 0.025676 -0.083
factorF3 0.011748 0.025676 0.458
ageGroupchild 0.261141 0.026702 9.780
characterrobot:factorF1 0.162318 0.025676 6.322
characterrobot:factorF3 0.426972 0.025676 16.629
characterrobot:ageGroupchild 0.054106 0.026702 2.026
factorF1:ageGroupchild 0.364138 0.025676 14.182
factorF3:ageGroupchild -0.210615 0.025676 -8.203
characterrobot:factorF1:ageGroupchild 0.007340 0.025676 0.286
characterrobot:factorF3:ageGroupchild -0.039077 0.025676 -1.522
Correlation of Fixed Effects:
(Intr) chrctr fctrF1 fctrF3 agGrpc chr:F1 chr:F3 chrc:G fcF1:G fcF3:G c:F1:G
charactrrbt 0.001
factorF1 0.000 0.000
factorF3 0.000 0.000 -0.500
ageGropchld -0.019 0.035 0.000 0.000
chrctrrb:F1 0.000 0.000 0.001 -0.001 0.000
chrctrrb:F3 0.000 0.000 -0.001 0.001 0.000 -0.500
chrctrrbt:G 0.035 -0.019 0.000 0.000 0.001 0.000 0.000
fctrF1:gGrp 0.000 0.000 -0.019 0.009 0.000 0.035 -0.017 0.000
fctrF3:gGrp 0.000 0.000 0.009 -0.019 0.000 -0.017 0.035 0.000 -0.500
chrctr:F1:G 0.000 0.000 0.035 -0.017 0.000 -0.019 0.009 0.000 0.001 -0.001
chrctr:F3:G 0.000 0.000 -0.017 0.035 0.000 0.009 -0.019 0.000 -0.001 0.001 -0.500
round(signif(summary(r3)$coefficients, 3), 2) %>% data.frame() # %>% View()
# stepwise regression
drop1(r3, test = "Chisq")
Single term deletions
Model:
score ~ character * factor * ageGroup + (1 | subid)
Df AIC LRT Pr(Chi)
<none> 2380.1
character:factor:ageGroup 2 2378.8 2.6407 0.267
r3_step2 <- lmer(score ~ character * factor + ageGroup + character:ageGroup + factor:ageGroup + (1 | subid), scores_all_analysis)
drop1(r3_step2, test = "Chisq")
Single term deletions
Model:
score ~ character * factor + ageGroup + character:ageGroup +
factor:ageGroup + (1 | subid)
Df AIC LRT Pr(Chi)
<none> 2378.8
character:factor 2 2796.0 421.21 < 2e-16 ***
character:ageGroup 1 2380.9 4.13 0.04219 *
factor:ageGroup 2 2555.4 180.62 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
r3_step3 <- lmer(score ~ character * factor + ageGroup + factor:ageGroup + (1 | subid), scores_all_analysis)
drop1(r3_step3, test = "Chisq")
Single term deletions
Model:
score ~ character * factor + ageGroup + factor:ageGroup + (1 |
subid)
Df AIC LRT Pr(Chi)
<none> 2380.9
character:factor 2 2798.1 421.21 < 2.2e-16 ***
factor:ageGroup 2 2557.5 180.62 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# # robot only
# robot_r1 <- lmer(score ~ factor + (1 | subid), scores_all_analysis %>% filter(character == "robot"))
# robot_r2 <- lmer(score ~ factor + ageGroup + (1 | subid), scores_all_analysis %>% filter(character == "robot"))
# robot_r3 <- lmer(score ~ factor * ageGroup + (1 | subid), scores_all_analysis %>% filter(character == "robot"))
# anova(robot_r1, robot_r2, robot_r3)
# # summary(robot_r1)
# # summary(robot_r2)
# summary(robot_r3)
scores_all_plotting <- d %>%
select(subid, ageGroup, character) %>%
distinct() %>%
full_join(scores_all) %>%
mutate(character = factor(character)) %>%
filter(!is.na(score_F1), !is.na(score_F2), !is.na(score_F3), !is.na(ageGroup)) %>%
gather(factor, score, starts_with("score_")) %>%
mutate(factor = factor(factor)) %>%
multi_boot(column = "score",
summary_groups = c("ageGroup", "character", "factor"),
statistics_functions = c("mean", "ci_lower", "ci_upper"))
Joining, by = c("subid", "ageGroup")
joining character vector and factor, coercing into character vector
# plot
ggplot(scores_all_plotting %>%
ungroup() %>%
mutate(factor = factor(factor,
labels = c("Social-emotional",
"Physiological",
"Perceptual-cognitive")),
ageGroup = factor(ageGroup,
levels = c("child", "adult"),
labels = c("children", "adults"))),
aes(x = ageGroup, y = mean, color = character, shape = character)) +
facet_wrap("factor", ncol = 3) +
theme_bw() +
theme(text = element_text(size = 28),
legend.position = "bottom") +
geom_point(size = 5, position = position_dodge(width = 0.4)) +
geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper),
width = 0.2, position = position_dodge(width = 0.4)) +
scale_shape_manual(values = c(19, 15)) +
labs(title = "Factor scores by age group",
# subtitle = "Adults (Study 1) vs. children (Study 2)\n",
x = "Age group",
y = "Mean factor score") # 1000 by 500

Children by age at test
scores_children <- fa(d3_child, nfactors = efa_comb_max_unrot_nfactors, rotate = rot_type,
cor = cor_type, scores = score_type)$scores %>%
data.frame() %>%
rownames_to_column(var = "subid") %>%
mutate(ageGroup = factor(ifelse(grepl("run", subid), "adult", "child")))
colnames(scores_children)[2:4] <- c("score_F1", "score_F2", "score_F3")
# analyze
scores_children_analysis <- d %>%
select(subid, age, character) %>%
distinct() %>%
left_join(scores_children) %>%
mutate(character = factor(character)) %>%
filter(!is.na(score_F1) & !is.na(score_F2) & !is.na(score_F3), !is.na(ageGroup)) %>%
gather(factor, score, starts_with("score_")) %>%
mutate(factor = factor(factor))
Joining, by = "subid"
joining character vector and factor, coercing into character vector
# set contrasts
contrasts(scores_children_analysis$factor) <- cbind(F1 = c(1, -1, 0), # MAKE SURE TO DOUBLE-CHECK!!
F3 = c(0, -1, 1))
contrasts(scores_children_analysis$character) <- cbind(robot = c(-1, 1))
r4 <- lmer(score ~ character * factor + (1 | subid), scores_children_analysis)
r5 <- lmer(score ~ character * factor + scale(age) + (1 | subid), scores_children_analysis)
r6 <- lmer(score ~ character * factor * scale(age) + (1 | subid), scores_children_analysis)
anova(r4, r5, r6)
refitting model(s) with ML (instead of REML)
Data: scores_children_analysis
Models:
r4: score ~ character * factor + (1 | subid)
r5: score ~ character * factor + scale(age) + (1 | subid)
r6: score ~ character * factor * scale(age) + (1 | subid)
Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)
r4 8 1349.2 1384.0 -666.60 1333.2
r5 9 1349.1 1388.3 -665.55 1331.1 2.083 1 0.1489
r6 14 1326.0 1386.9 -648.99 1298.0 33.124 5 3.556e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# summary(r4)
# summary(r5)
summary(r6)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ character * factor * scale(age) + (1 | subid)
Data: scores_children_analysis
REML criterion at convergence: 1354.4
Scaled residuals:
Min 1Q Median 3Q Max
-3.7447 -0.6084 0.0992 0.6120 1.7989
Random effects:
Groups Name Variance Std.Dev.
subid (Intercept) 0.1869 0.4323
Residual 0.4376 0.6615
Number of obs: 573, groups: subid, 191
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.011058 0.041788 -0.265
characterrobot -0.276799 0.041788 -6.624
factorF1 0.004414 0.039127 0.113
factorF3 0.026090 0.039127 0.667
scale(age) -0.068391 0.041940 -1.631
characterrobot:factorF1 0.192426 0.039127 4.918
characterrobot:factorF3 0.378237 0.039127 9.667
characterrobot:scale(age) -0.093505 0.041940 -2.229
factorF1:scale(age) -0.181942 0.039270 -4.633
factorF3:scale(age) 0.175481 0.039270 4.469
characterrobot:factorF1:scale(age) -0.049025 0.039270 -1.248
characterrobot:factorF3:scale(age) 0.017576 0.039270 0.448
Correlation of Fixed Effects:
(Intr) chrctr fctrF1 fctrF3 scl(g) chr:F1 chr:F3 chr:() fF1:() fF3:() c:F1:(
charactrrbt 0.037
factorF1 0.000 0.000
factorF3 0.000 0.000 -0.500
scale(age) 0.004 0.030 0.000 0.000
chrctrrb:F1 0.000 0.000 0.037 -0.018 0.000
chrctrrb:F3 0.000 0.000 -0.018 0.037 0.000 -0.500
chrctrrb:() 0.030 0.004 0.000 0.000 0.083 0.000 0.000
fctrF1:sc() 0.000 0.000 0.004 -0.002 0.000 0.030 -0.015 0.000
fctrF3:sc() 0.000 0.000 -0.002 0.004 0.000 -0.015 0.030 0.000 -0.500
chrct:F1:() 0.000 0.000 0.030 -0.015 0.000 0.004 -0.002 0.000 0.083 -0.041
chrct:F3:() 0.000 0.000 -0.015 0.030 0.000 -0.002 0.004 0.000 -0.041 0.083 -0.500
# stepwise regression
drop1(r6, test = "Chisq")
Single term deletions
Model:
score ~ character * factor * scale(age) + (1 | subid)
Df AIC LRT Pr(Chi)
<none> 1326.0
character:factor:scale(age) 2 1323.6 1.6309 0.4424
r6_step2 <- lmer(score ~ character * factor + scale(age) + character:scale(age) + factor:scale(age) + (1 | subid), scores_children_analysis)
drop1(r6_step2, test = "Chisq")
Single term deletions
Model:
score ~ character * factor + scale(age) + character:scale(age) +
factor:scale(age) + (1 | subid)
Df AIC LRT Pr(Chi)
<none> 1323.6
character:factor 2 1495.9 176.314 < 2.2e-16 ***
character:scale(age) 1 1326.6 5.011 0.02519 *
factor:scale(age) 2 1346.1 26.482 1.776e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
summary(r6_step2)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ character * factor + scale(age) + character:scale(age) +
factor:scale(age) + (1 | subid)
Data: scores_children_analysis
REML criterion at convergence: 1346.5
Scaled residuals:
Min 1Q Median 3Q Max
-3.7360 -0.6072 0.1213 0.6161 1.7471
Random effects:
Groups Name Variance Std.Dev.
subid (Intercept) 0.1871 0.4325
Residual 0.4372 0.6612
Number of obs: 573, groups: subid, 191
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.011058 0.041788 -0.265
characterrobot -0.276799 0.041788 -6.624
factorF1 0.005869 0.039089 0.150
factorF3 0.025568 0.039089 0.654
scale(age) -0.068391 0.041940 -1.631
characterrobot:factorF1 0.192599 0.039106 4.925
characterrobot:factorF3 0.378175 0.039106 9.671
characterrobot:scale(age) -0.093505 0.041940 -2.229
factorF1:scale(age) -0.177878 0.039114 -4.548
factorF3:scale(age) 0.174024 0.039114 4.449
Correlation of Fixed Effects:
(Intr) chrctr fctrF1 fctrF3 scl(g) chr:F1 chr:F3 chr:() fF1:()
charactrrbt 0.037
factorF1 0.000 0.000
factorF3 0.000 0.000 -0.500
scale(age) 0.004 0.030 0.000 0.000
chrctrrb:F1 0.000 0.000 0.037 -0.018 0.000
chrctrrb:F3 0.000 0.000 -0.018 0.037 0.000 -0.500
chrctrrb:() 0.030 0.004 0.000 0.000 0.083 0.000 0.000
fctrF1:sc() 0.000 0.000 0.001 -0.001 0.000 0.030 -0.015 0.000
fctrF3:sc() 0.000 0.000 -0.001 0.001 0.000 -0.015 0.030 0.000 -0.500
# explore polynoial effects of age
r6b <- lmer(score ~ character * factor * poly(age, 1) + (1 | subid), scores_children_analysis)
r7 <- lmer(score ~ character * factor * poly(age, 2) + (1 | subid), scores_children_analysis)
r8 <- lmer(score ~ character * factor * poly(age, 3) + (1 | subid), scores_children_analysis)
anova(r6b, r7, r8)
refitting model(s) with ML (instead of REML)
Data: scores_children_analysis
Models:
r6b: score ~ character * factor * poly(age, 1) + (1 | subid)
r7: score ~ character * factor * poly(age, 2) + (1 | subid)
r8: score ~ character * factor * poly(age, 3) + (1 | subid)
Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)
r6b 14 1326.0 1386.9 -648.99 1298.0
r7 20 1333.6 1420.7 -646.82 1293.6 4.3390 6 0.6309
r8 26 1339.2 1452.4 -643.63 1287.2 6.3931 6 0.3806
# summary(r6b)
# summary(r7)
summary(r8)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ character * factor * poly(age, 3) + (1 | subid)
Data: scores_children_analysis
REML criterion at convergence: 1286
Scaled residuals:
Min 1Q Median 3Q Max
-3.6776 -0.5895 0.1163 0.6146 1.8350
Random effects:
Groups Name Variance Std.Dev.
subid (Intercept) 0.1863 0.4317
Residual 0.4395 0.6630
Number of obs: 573, groups: subid, 191
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.009218 0.041837 -0.220
characterrobot -0.273475 0.041837 -6.537
factorF1 0.005125 0.039254 0.131
factorF3 0.025541 0.039254 0.651
poly(age, 3)1 -1.609781 1.006591 -1.599
poly(age, 3)2 1.558244 1.006784 1.548
poly(age, 3)3 -1.004197 1.006149 -0.998
characterrobot:factorF1 0.192529 0.039254 4.905
characterrobot:factorF3 0.379938 0.039254 9.679
characterrobot:poly(age, 3)1 -2.262846 1.006591 -2.248
characterrobot:poly(age, 3)2 0.911678 1.006784 0.906
characterrobot:poly(age, 3)3 -0.014819 1.006149 -0.015
factorF1:poly(age, 3)1 -4.209639 0.944458 -4.457
factorF3:poly(age, 3)1 4.192109 0.944458 4.439
factorF1:poly(age, 3)2 -0.006339 0.944639 -0.007
factorF3:poly(age, 3)2 0.788518 0.944639 0.835
factorF1:poly(age, 3)3 0.358472 0.944043 0.380
factorF3:poly(age, 3)3 -0.906646 0.944043 -0.960
characterrobot:factorF1:poly(age, 3)1 -1.133380 0.944458 -1.200
characterrobot:factorF3:poly(age, 3)1 0.374304 0.944458 0.396
characterrobot:factorF1:poly(age, 3)2 0.544462 0.944639 0.576
characterrobot:factorF3:poly(age, 3)2 -0.279024 0.944639 -0.295
characterrobot:factorF1:poly(age, 3)3 1.620142 0.944043 1.716
characterrobot:factorF3:poly(age, 3)3 0.080046 0.944043 0.085
Correlation matrix not shown by default, as p = 24 > 12.
Use print(x, correlation=TRUE) or
vcov(x) if you need it
round(signif(summary(r6)$coefficients, 3), 2) %>% data.frame() # %>% View()
# stepwise regression
drop1(r8, test = "Chisq")
Single term deletions
Model:
score ~ character * factor * poly(age, 3) + (1 | subid)
Df AIC LRT Pr(Chi)
<none> 1339.2
character:factor:poly(age, 3) 6 1333.5 6.2353 0.3973
r8_step2 <- lmer(score ~ character * factor * poly(age, 2) + poly(age, 3) + poly(age, 3):character + poly(age, 3):factor + (1 | subid), scores_children_analysis)
fixed-effect model matrix is rank deficient so dropping 8 columns / coefficients
drop1(r8_step2, test = "Chisq")
fixed-effect model matrix is rank deficient so dropping 6 columns / coefficients
fixed-effect model matrix is rank deficient so dropping 4 columns / coefficients
fixed-effect model matrix is rank deficient so dropping 8 columns / coefficients
Single term deletions
Model:
score ~ character * factor * poly(age, 2) + poly(age, 3) + poly(age,
3):character + poly(age, 3):factor + (1 | subid)
Df AIC LRT Pr(Chi)
<none> 1339.5
character:poly(age, 3) 1 1337.5 0.00023 0.9880
factor:poly(age, 3) 2 1336.6 1.06360 0.5875
character:factor:poly(age, 2) 4 1333.5 1.94831 0.7453
r8_step3 <- lmer(score ~ character * factor + poly(age, 3) + (1 | subid) + poly(age, 2) + character:poly(age, 2) + factor:poly(age, 2), scores_children_analysis)
fixed-effect model matrix is rank deficient so dropping 2 columns / coefficients
drop1(r8_step3, test = "Chisq")
fixed-effect model matrix is rank deficient so dropping 2 columns / coefficients
fixed-effect model matrix is rank deficient so dropping 2 columns / coefficients
fixed-effect model matrix is rank deficient so dropping 2 columns / coefficients
Single term deletions
Model:
score ~ character * factor + poly(age, 3) + (1 | subid) + poly(age,
2) + character:poly(age, 2) + factor:poly(age, 2)
Df AIC LRT Pr(Chi)
<none> 1328.6
poly(age, 3) 1 1327.6 1.042 0.30730
character:factor 2 1501.7 177.145 < 2.2e-16 ***
character:poly(age, 2) 2 1330.6 6.068 0.04813 *
factor:poly(age, 2) 4 1348.0 27.429 1.628e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
summary(r8_step3)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ character * factor + poly(age, 3) + (1 | subid) + poly(age,
2) + character:poly(age, 2) + factor:poly(age, 2)
Data: scores_children_analysis
REML criterion at convergence: 1307.5
Scaled residuals:
Min 1Q Median 3Q Max
-3.6334 -0.6248 0.1262 0.6120 1.8183
Random effects:
Groups Name Variance Std.Dev.
subid (Intercept) 0.1849 0.4300
Residual 0.4384 0.6621
Number of obs: 573, groups: subid, 191
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.009222 0.041722 -0.221
characterrobot -0.273473 0.041723 -6.555
factorF1 0.005865 0.039145 0.150
factorF3 0.025625 0.039145 0.655
poly(age, 3)1 -1.608642 1.000886 -1.607
poly(age, 3)2 1.558439 1.003958 1.552
poly(age, 3)3 -1.002889 0.999495 -1.003
characterrobot:factorF1 0.192500 0.039203 4.910
characterrobot:factorF3 0.379724 0.039203 9.686
characterrobot:poly(age, 2)1 -2.262649 1.003765 -2.254
characterrobot:poly(age, 2)2 0.911745 1.004034 0.908
factorF1:poly(age, 2)1 -4.254305 0.936802 -4.541
factorF3:poly(age, 2)1 4.163146 0.936802 4.444
factorF1:poly(age, 2)2 -0.051458 0.937381 -0.055
factorF3:poly(age, 2)2 0.806436 0.937381 0.860
Correlation matrix not shown by default, as p = 15 > 12.
Use print(x, correlation=TRUE) or
vcov(x) if you need it
fit warnings:
fixed-effect model matrix is rank deficient so dropping 2 columns / coefficients
# # robot only
# robot_r4 <- lmer(score ~ factor + (1 | subid), scores_children_analysis %>% filter(character == "robot"))
# robot_r5 <- lmer(score ~ factor + scale(age) + (1 | subid), scores_children_analysis %>% filter(character == "robot"))
# robot_r6 <- lmer(score ~ factor * scale(age) + (1 | subid), scores_children_analysis %>% filter(character == "robot"))
# anova(robot_r4, robot_r5, robot_r6)
# # summary(robot_r4)
# # summary(robot_r5)
# summary(robot_r6)
scores_children_plotting <- d %>%
select(subid, age, character) %>%
distinct() %>%
full_join(scores_children) %>%
mutate(character = factor(character)) %>%
filter(!is.na(score_F1), !is.na(score_F2), !is.na(score_F3), !is.na(age)) %>%
gather(factor, score, starts_with("score_")) %>%
mutate(factor = factor(factor)) %>%
multi_boot(column = "score",
summary_groups = c("age", "character", "factor"),
statistics_functions = c("mean", "ci_lower", "ci_upper"))
Joining, by = "subid"
joining character vector and factor, coercing into character vector
# plot
ggplot(scores_children_plotting %>%
ungroup() %>%
mutate(factor = factor(factor,
labels = c("Social-emotional",
"Physiological",
"Perceptual-cognitive"))),
aes(x = age, y = mean, color = character, fill = character, shape = character)) +
facet_wrap("factor", ncol = 3) +
theme_bw() +
theme(text = element_text(size = 28),
legend.position = "bottom") +
# geom_smooth(method = "loess", alpha = 0.4) +
geom_smooth(method = "lm", alpha = 0.4) +
geom_point(size = 2) +
scale_shape_manual(values = c(19, 15)) +
labs(title = "Factor scores by children's age",
# subtitle = "Children (Study 2)\n",
x = "Age (years)",
y = "Factor score") # 1000 by 500

Adults by age at test
scores_adults <- fa(d3_adult, nfactors = efa_comb_max_unrot_nfactors, rotate = rot_type,
cor = cor_type, scores = score_type)$scores %>%
data.frame() %>%
rownames_to_column(var = "subid") %>%
mutate(ageGroup = factor(ifelse(grepl("run", subid), "adult", "adult")))
colnames(scores_adults)[2:4] <- c("score_F1", "score_F2", "score_F3")
# analyze
scores_adults_analysis <- d %>%
select(subid, age, character) %>%
distinct() %>%
left_join(scores_adults) %>%
mutate(character = factor(character)) %>%
filter(!is.na(score_F1) & !is.na(score_F2) & !is.na(score_F3), !is.na(age)) %>%
gather(factor, score, starts_with("score_")) %>%
mutate(factor = factor(factor))
Joining, by = "subid"
joining character vector and factor, coercing into character vector
# set contrasts
contrasts(scores_adults_analysis$factor) <- cbind(F1 = c(1, -1, 0), # MAKE SURE TO DOUBLE-CHECK!!
F3 = c(0, -1, 1))
contrasts(scores_adults_analysis$character) <- cbind(robot = c(-1, 1))
r4 <- lmer(score ~ character * factor + (1 | subid), scores_adults_analysis)
r5 <- lmer(score ~ character * factor + scale(age) + (1 | subid), scores_adults_analysis)
r6 <- lmer(score ~ character * factor * scale(age) + (1 | subid), scores_adults_analysis)
anova(r4, r5, r6)
refitting model(s) with ML (instead of REML)
Data: scores_adults_analysis
Models:
r4: score ~ character * factor + (1 | subid)
r5: score ~ character * factor + scale(age) + (1 | subid)
r6: score ~ character * factor * scale(age) + (1 | subid)
Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)
r4 8 1207.3 1241.6 -595.64 1191.3
r5 9 1208.1 1246.7 -595.06 1190.1 1.1564 1 0.2822
r6 14 1213.8 1273.8 -592.92 1185.8 4.2809 5 0.5097
# summary(r4)
# summary(r5)
summary(r6)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ character * factor * scale(age) + (1 | subid)
Data: scores_adults_analysis
REML criterion at convergence: 1242.2
Scaled residuals:
Min 1Q Median 3Q Max
-4.0168 -0.4237 -0.0343 0.4084 4.6002
Random effects:
Groups Name Variance Std.Dev.
subid (Intercept) 0.2230 0.4723
Residual 0.3908 0.6251
Number of obs: 537, groups: subid, 179
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.011207 0.044438 -0.252
characterrobot -0.293458 0.044438 -6.604
factorF1 -0.016593 0.038161 -0.435
factorF3 0.005019 0.038161 0.132
scale(age) -0.050393 0.044797 -1.125
characterrobot:factorF1 0.058056 0.038161 1.521
characterrobot:factorF3 0.540104 0.038161 14.153
characterrobot:scale(age) 0.024901 0.044797 0.556
factorF1:scale(age) -0.052757 0.038469 -1.371
factorF3:scale(age) 0.018846 0.038469 0.490
characterrobot:factorF1:scale(age) -0.015534 0.038469 -0.404
characterrobot:factorF3:scale(age) 0.051006 0.038469 1.326
Correlation of Fixed Effects:
(Intr) chrctr fctrF1 fctrF3 scl(g) chr:F1 chr:F3 chr:() fF1:() fF3:() c:F1:(
charactrrbt -0.017
factorF1 0.000 0.000
factorF3 0.000 0.000 -0.500
scale(age) 0.002 -0.016 0.000 0.000
chrctrrb:F1 0.000 0.000 -0.017 0.008 0.000
chrctrrb:F3 0.000 0.000 0.008 -0.017 0.000 -0.500
chrctrrb:() -0.016 0.002 0.000 0.000 -0.120 0.000 0.000
fctrF1:sc() 0.000 0.000 0.002 -0.001 0.000 -0.016 0.008 0.000
fctrF3:sc() 0.000 0.000 -0.001 0.002 0.000 0.008 -0.016 0.000 -0.500
chrct:F1:() 0.000 0.000 -0.016 0.008 0.000 0.002 -0.001 0.000 -0.120 0.060
chrct:F3:() 0.000 0.000 0.008 -0.016 0.000 -0.001 0.002 0.000 0.060 -0.120 -0.500
# stepwise regression
drop1(r6, test = "Chisq")
Single term deletions
Model:
score ~ character * factor * scale(age) + (1 | subid)
Df AIC LRT Pr(Chi)
<none> 1213.8
character:factor:scale(age) 2 1211.7 1.8848 0.3897
r6_step2 <- lmer(score ~ character * factor + scale(age) + character:scale(age) + factor:scale(age) + (1 | subid), scores_adults_analysis)
drop1(r6_step2, test = "Chisq")
Single term deletions
Model:
score ~ character * factor + scale(age) + character:scale(age) +
factor:scale(age) + (1 | subid)
Df AIC LRT Pr(Chi)
<none> 1211.7
character:factor 2 1427.8 220.084 <2e-16 ***
character:scale(age) 1 1210.0 0.316 0.5742
factor:scale(age) 2 1209.8 2.080 0.3534
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
summary(r6_step2)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ character * factor + scale(age) + character:scale(age) +
factor:scale(age) + (1 | subid)
Data: scores_adults_analysis
REML criterion at convergence: 1234.4
Scaled residuals:
Min 1Q Median 3Q Max
-4.0512 -0.4230 -0.0566 0.4368 4.6452
Random effects:
Groups Name Variance Std.Dev.
subid (Intercept) 0.2231 0.4723
Residual 0.3906 0.6250
Number of obs: 537, groups: subid, 179
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.011207 0.044438 -0.252
characterrobot -0.293458 0.044438 -6.604
factorF1 -0.016837 0.038148 -0.441
factorF3 0.005821 0.038148 0.153
scale(age) -0.050393 0.044797 -1.125
characterrobot:factorF1 0.058089 0.038153 1.523
characterrobot:factorF3 0.539995 0.038153 14.154
characterrobot:scale(age) 0.024901 0.044797 0.556
factorF1:scale(age) -0.054621 0.038183 -1.431
factorF3:scale(age) 0.024964 0.038183 0.654
Correlation of Fixed Effects:
(Intr) chrctr fctrF1 fctrF3 scl(g) chr:F1 chr:F3 chr:() fF1:()
charactrrbt -0.017
factorF1 0.000 0.000
factorF3 0.000 0.000 -0.500
scale(age) 0.002 -0.016 0.000 0.000
chrctrrb:F1 0.000 0.000 -0.017 0.008 0.000
chrctrrb:F3 0.000 0.000 0.008 -0.017 0.000 -0.500
chrctrrb:() -0.016 0.002 0.000 0.000 -0.120 0.000 0.000
fctrF1:sc() 0.000 0.000 0.000 0.000 0.000 -0.016 0.008 0.000
fctrF3:sc() 0.000 0.000 0.000 0.000 0.000 0.008 -0.016 0.000 -0.500
# explore polynoial effects of age
r6b <- lmer(score ~ character * factor * poly(age, 1) + (1 | subid), scores_adults_analysis)
r7 <- lmer(score ~ character * factor * poly(age, 2) + (1 | subid), scores_adults_analysis)
r8 <- lmer(score ~ character * factor * poly(age, 3) + (1 | subid), scores_adults_analysis)
anova(r6b, r7, r8)
refitting model(s) with ML (instead of REML)
Data: scores_adults_analysis
Models:
r6b: score ~ character * factor * poly(age, 1) + (1 | subid)
r7: score ~ character * factor * poly(age, 2) + (1 | subid)
r8: score ~ character * factor * poly(age, 3) + (1 | subid)
Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)
r6b 14 1213.8 1273.8 -592.92 1185.8
r7 20 1213.4 1299.1 -586.69 1173.4 12.4708 6 0.05225 .
r8 26 1224.7 1336.1 -586.34 1172.7 0.7074 6 0.99433
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# summary(r6b)
summary(r7)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ character * factor * poly(age, 2) + (1 | subid)
Data: scores_adults_analysis
REML criterion at convergence: 1182.5
Scaled residuals:
Min 1Q Median 3Q Max
-4.0899 -0.4027 -0.0625 0.3979 4.5820
Random effects:
Groups Name Variance Std.Dev.
subid (Intercept) 0.2258 0.4752
Residual 0.3838 0.6195
Number of obs: 537, groups: subid, 179
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.013821 0.044604 -0.310
characterrobot -0.288926 0.044604 -6.478
factorF1 -0.012467 0.037934 -0.329
factorF3 0.004282 0.037934 0.113
poly(age, 2)1 -1.300348 1.050355 -1.238
poly(age, 2)2 -1.351269 1.067305 -1.266
characterrobot:factorF1 0.050154 0.037934 1.322
characterrobot:factorF3 0.547843 0.037934 14.442
characterrobot:poly(age, 2)1 0.789137 1.050355 0.751
characterrobot:poly(age, 2)2 0.735624 1.067305 0.689
factorF1:poly(age, 2)1 -1.007735 0.893292 -1.128
factorF3:poly(age, 2)1 0.375079 0.893292 0.420
factorF1:poly(age, 2)2 2.362246 0.907707 2.602
factorF3:poly(age, 2)2 -2.361103 0.907707 -2.601
characterrobot:factorF1:poly(age, 2)1 -0.728801 0.893292 -0.816
characterrobot:factorF3:poly(age, 2)1 1.530346 0.893292 1.713
characterrobot:factorF1:poly(age, 2)2 -1.150237 0.907707 -1.267
characterrobot:factorF3:poly(age, 2)2 0.114011 0.907707 0.126
Correlation matrix not shown by default, as p = 18 > 12.
Use print(x, correlation=TRUE) or
vcov(x) if you need it
summary(r8)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ character * factor * poly(age, 3) + (1 | subid)
Data: scores_adults_analysis
REML criterion at convergence: 1171.4
Scaled residuals:
Min 1Q Median 3Q Max
-4.1034 -0.4011 -0.0510 0.3955 4.6072
Random effects:
Groups Name Variance Std.Dev.
subid (Intercept) 0.2280 0.4775
Residual 0.3878 0.6227
Number of obs: 537, groups: subid, 179
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.013618 0.045051 -0.302
characterrobot -0.290844 0.045051 -6.456
factorF1 -0.012000 0.038324 -0.313
factorF3 0.003807 0.038324 0.099
poly(age, 3)1 -1.284857 1.096062 -1.172
poly(age, 3)2 -1.321065 1.097023 -1.204
poly(age, 3)3 0.548704 1.150627 0.477
characterrobot:factorF1 0.049074 0.038324 1.281
characterrobot:factorF3 0.547170 0.038324 14.278
characterrobot:poly(age, 3)1 0.664243 1.096062 0.606
characterrobot:poly(age, 3)2 0.650407 1.097023 0.593
characterrobot:poly(age, 3)3 0.057939 1.150627 0.050
factorF1:poly(age, 3)1 -0.976145 0.932389 -1.047
factorF3:poly(age, 3)1 0.344958 0.932389 0.370
factorF1:poly(age, 3)2 2.394466 0.933206 2.566
factorF3:poly(age, 3)2 -2.374164 0.933206 -2.544
factorF1:poly(age, 3)3 0.287298 0.978805 0.294
factorF3:poly(age, 3)3 0.226055 0.978805 0.231
characterrobot:factorF1:poly(age, 3)1 -0.799517 0.932389 -0.857
characterrobot:factorF3:poly(age, 3)1 1.487166 0.932389 1.595
characterrobot:factorF1:poly(age, 3)2 -1.202131 0.933206 -1.288
characterrobot:factorF3:poly(age, 3)2 0.090213 0.933206 0.097
characterrobot:factorF1:poly(age, 3)3 -0.070350 0.978805 -0.072
characterrobot:factorF3:poly(age, 3)3 0.180401 0.978805 0.184
Correlation matrix not shown by default, as p = 24 > 12.
Use print(x, correlation=TRUE) or
vcov(x) if you need it
round(signif(summary(r6)$coefficients, 3), 2) %>% data.frame() # %>% View()
# stepwise regression
drop1(r8, test = "Chisq")
Single term deletions
Model:
score ~ character * factor * poly(age, 3) + (1 | subid)
Df AIC LRT Pr(Chi)
<none> 1224.7
character:factor:poly(age, 3) 6 1217.5 4.8345 0.5652
r8_step2 <- lmer(score ~ character * factor * poly(age, 2) + poly(age, 3) + poly(age, 3):character + poly(age, 3):factor + (1 | subid), scores_adults_analysis)
fixed-effect model matrix is rank deficient so dropping 8 columns / coefficients
drop1(r8_step2, test = "Chisq")
fixed-effect model matrix is rank deficient so dropping 6 columns / coefficients
fixed-effect model matrix is rank deficient so dropping 4 columns / coefficients
fixed-effect model matrix is rank deficient so dropping 8 columns / coefficients
Single term deletions
Model:
score ~ character * factor * poly(age, 2) + poly(age, 3) + poly(age,
3):character + poly(age, 3):factor + (1 | subid)
Df AIC LRT Pr(Chi)
<none> 1220.7
character:poly(age, 3) 1 1218.7 0.0027 0.9589
factor:poly(age, 3) 2 1217.1 0.3780 0.8278
character:factor:poly(age, 2) 4 1217.5 4.7984 0.3086
r8_step3 <- lmer(score ~ character * factor + poly(age, 3) + (1 | subid) + poly(age, 2) + character:poly(age, 2) + factor:poly(age, 2), scores_adults_analysis)
fixed-effect model matrix is rank deficient so dropping 2 columns / coefficients
drop1(r8_step3, test = "Chisq")
fixed-effect model matrix is rank deficient so dropping 2 columns / coefficients
fixed-effect model matrix is rank deficient so dropping 2 columns / coefficients
fixed-effect model matrix is rank deficient so dropping 2 columns / coefficients
Single term deletions
Model:
score ~ character * factor + poly(age, 3) + (1 | subid) + poly(age,
2) + character:poly(age, 2) + factor:poly(age, 2)
Df AIC LRT Pr(Chi)
<none> 1212.1
poly(age, 3) 1 1210.4 0.291 0.58980
character:factor 2 1432.5 224.396 < 2e-16 ***
character:poly(age, 2) 2 1208.8 0.689 0.70858
factor:poly(age, 2) 4 1213.7 9.571 0.04831 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
summary(r8_step3)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ character * factor + poly(age, 3) + (1 | subid) + poly(age,
2) + character:poly(age, 2) + factor:poly(age, 2)
Data: scores_adults_analysis
REML criterion at convergence: 1191.1
Scaled residuals:
Min 1Q Median 3Q Max
-4.1355 -0.4001 -0.0436 0.4120 4.6959
Random effects:
Groups Name Variance Std.Dev.
subid (Intercept) 0.2269 0.4764
Residual 0.3847 0.6203
Number of obs: 537, groups: subid, 179
Fixed effects:
Estimate Std. Error t value
(Intercept) -0.013396 0.044705 -0.300
characterrobot -0.290959 0.044862 -6.486
factorF1 -0.016726 0.037859 -0.442
factorF3 0.005705 0.037859 0.151
poly(age, 3)1 -1.270282 1.054085 -1.205
poly(age, 3)2 -1.310171 1.072356 -1.222
poly(age, 3)3 0.568822 1.075902 0.529
characterrobot:factorF1 0.051489 0.037971 1.356
characterrobot:factorF3 0.546883 0.037971 14.402
characterrobot:poly(age, 2)1 0.656489 1.082040 0.607
characterrobot:poly(age, 2)2 0.642943 1.083806 0.593
factorF1:poly(age, 2)1 -1.262164 0.877291 -1.439
factorF3:poly(age, 2)1 0.575451 0.877291 0.656
factorF1:poly(age, 2)2 2.026798 0.879689 2.304
factorF3:poly(age, 2)2 -2.115283 0.879689 -2.405
Correlation matrix not shown by default, as p = 15 > 12.
Use print(x, correlation=TRUE) or
vcov(x) if you need it
fit warnings:
fixed-effect model matrix is rank deficient so dropping 2 columns / coefficients
scores_adults_plotting <- d %>%
filter(!is.na(age)) %>%
select(subid, age, character) %>%
distinct() %>%
full_join(scores_adults) %>%
mutate(character = factor(character)) %>%
filter(!is.na(score_F1), !is.na(score_F2), !is.na(score_F3), !is.na(age)) %>%
gather(factor, score, starts_with("score_")) %>%
mutate(factor = factor(factor)) %>%
multi_boot(column = "score",
summary_groups = c("age", "character", "factor"),
statistics_functions = c("mean", "ci_lower", "ci_upper"))
Joining, by = "subid"
joining character vector and factor, coercing into character vector
# plot
ggplot(scores_adults_plotting %>%
ungroup() %>%
mutate(factor = factor(factor,
labels = c("Social-emotional",
"Physiological",
"Perceptual-cognitive"))),
aes(x = age, y = mean, color = character, fill = character, shape = character)) +
facet_wrap("factor", ncol = 3) +
theme_bw() +
theme(text = element_text(size = 28),
legend.position = "bottom") +
# geom_smooth(method = "loess", alpha = 0.4) +
geom_smooth(method = "lm", alpha = 0.4) +
geom_point(size = 2) +
scale_shape_manual(values = c(19, 15)) +
labs(title = "Factor scores by adults's age",
# subtitle = "Adults (Study 2)\n",
x = "Age (years)",
y = "Factor score") # 1000 by 500

Big figure
# by condition
d1_bycond2 <- d2 %>%
left_join(d_child02 %>% select(subid, age)) %>%
select(character, capacity, capWording, responseNum, subid, ageGroup, age) %>%
filter(capacity != "na", is.na(responseNum) == F) %>%
mutate(capWording = gsub(" --.*", "", capWording),
ageGroup3 = ifelse(ageGroup == "adult", "adult",
ifelse(is.na(age), NA,
ifelse(age < 8, "7y",
ifelse(age < 9, "8y",
ifelse(age < 10, "9y",
NA)))))) %>%
distinct()
Joining, by = c("subid", "age")
joining factors with different levels, coercing to character vector
d1_bycond2 %>% select(ageGroup3, subid) %>% distinct() %>% count(ageGroup3)
# make df for plotting
d1_bycond2_mb <- multi_boot(d1_bycond2,
column = "responseNum",
summary_groups = c("ageGroup3", "character", "capacity", "capWording"),
statistics_functions = c("mean", "ci_lower", "ci_upper"))
d1_bycond2_mb_factorsAll <- d1_bycond2_mb %>%
full_join(efa_comb_small_rot_loadings %>%
group_by(factor) %>%
mutate(order = rank(desc(loading_abs)))) %>%
arrange(character, factor, desc(loading_abs)) %>%
rownames_to_column(var = "full_order") %>%
mutate(full_order = as.numeric(full_order)) %>%
arrange(factorName, full_order) %>%
ungroup() %>%
filter(!is.na(ageGroup3)) %>%
mutate(factorName = factor(factorName,
levels = c("Factor 1", "Factor 2", "Factor 3"),
labels = c("Social-emotional",
"Physiological",
"Perceptual-cognitive")))
Joining, by = c("capacity", "capWording")
joining character vector and factor, coercing into character vector
dodge_width <- 2
ggplot(d1_bycond2_mb_factorsAll,
aes(x = desc(order*2), y = mean,
color = ageGroup3, shape = ageGroup3,
label = capWording)) +
facet_grid(factorName ~ character, scales = "free", space = "free") +
geom_hline(yintercept = 0, lty = 3) +
geom_hline(yintercept = 0.5, lty = 3) +
geom_hline(yintercept = 1, lty = 3) +
geom_point(stat = "identity", position = position_dodge(width = dodge_width), size = 8) +
scale_shape_manual(values = c(rep(18, 3), 17)) +
# scale_colour_brewer(type = "seq", palette = "PuRd") +
scale_colour_hue(h = c(0, 180)) +
geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper),
position = position_dodge(width = dodge_width), width = 0) +
geom_text(aes(y = -0.5, hjust = 0),
color = "black",
# color = d1_bycond2_mb_factorsAll$textColor,
size = 8) +
labs(title = "Responses by mental capacity item",
y = "Mean response (0 = NO, 0.5 = KINDA, 1 = YES)",
x = "Capacity",
color = "Age group: ", shape = "Age group: ") +
scale_y_continuous(breaks = c(0, 0.5, 1)) +
coord_flip() +
theme_bw() +
theme(text = element_text(size = 28),
# axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
legend.position = "top") # 1700 by 2000

# FILTERED BY ROBOT
# feel safe
with(d2 %>% filter(capWording == "feel_safe",
!is.na(responseCat),
character == "robot"),
table(ageGroup, responseCat)) #%>%
responseCat
ageGroup no kinda yes
adult 82 15 3
child 33 22 40
#summary()
# feel tired
with(d2 %>% filter(capWording == "feel_tired",
!is.na(responseCat),
character == "robot"),
table(ageGroup, responseCat)) #%>%
responseCat
ageGroup no kinda yes
adult 88 6 6
child 38 20 36
#summary()
# feel scared
with(d2 %>% filter(capWording == "feel_scared",
!is.na(responseCat),
character == "robot"),
table(ageGroup, responseCat)) #%>%
responseCat
ageGroup no kinda yes
adult 93 4 3
child 50 18 28
#summary()
# get hungry
with(d2 %>% filter(capWording == "get_hungry",
!is.na(responseCat),
character == "robot"),
table(ageGroup, responseCat)) #%>%
responseCat
ageGroup no kinda yes
adult 96 1 2
child 74 5 15
#summary()
# feel pain
with(d2 %>% filter(capWording == "feel_pain",
!is.na(responseCat),
character == "robot"),
table(ageGroup, responseCat)) #%>%
responseCat
ageGroup no kinda yes
adult 94 4 2
child 65 12 17
#summary()
# feel proud
proud_table <- with(d2 %>% filter(capWording == "feel_proud",
!is.na(responseCat),
character == "robot") %>%
mutate(ageGroup3 = ifelse(ageGroup == "adult", "adult",
ifelse(is.na(age), NA,
ifelse(age < 8, "7",
ifelse(age < 9, "8",
"9"))))),
table(ageGroup3, responseCat)) %>%
prop.table(1)
proud_table
responseCat
ageGroup3 no kinda yes
7 0.16666667 0.13888889 0.69444444
8 0.33333333 0.21212121 0.45454545
9 0.45833333 0.20833333 0.33333333
adult 0.90099010 0.08910891 0.00990099
proud_table[3,2]+proud_table[3,3]
[1] 0.5416667
# feel happy
happy_table <- with(d2 %>% filter(capWording == "feel_happy",
!is.na(responseCat),
character == "robot") %>%
mutate(ageGroup3 = ifelse(ageGroup == "adult", "adult",
ifelse(is.na(age), NA,
ifelse(age < 8, "7",
ifelse(age < 9, "8",
"9"))))),
table(ageGroup3, responseCat)) %>%
prop.table(1)
happy_table
responseCat
ageGroup3 no kinda yes
7 0.16666667 0.11111111 0.72222222
8 0.28571429 0.17142857 0.54285714
9 0.41666667 0.16666667 0.41666667
adult 0.89108911 0.03960396 0.06930693
happy_table[3,2]+happy_table[3,3]
[1] 0.5833333
# feel guilty
guilty_table <- with(d2 %>% filter(capWording == "feel_guilty",
!is.na(responseCat),
character == "robot") %>%
mutate(ageGroup3 = ifelse(ageGroup == "adult", "adult",
ifelse(is.na(age), NA,
ifelse(age < 8, "7",
ifelse(age < 9, "8",
"9"))))),
table(ageGroup3, responseCat)) %>%
prop.table(1)
guilty_table
responseCat
ageGroup3 no kinda yes
7 0.4594595 0.2162162 0.3243243
8 0.4705882 0.2058824 0.3235294
9 0.5000000 0.2500000 0.2500000
adult 0.9700000 0.0300000 0.0000000
guilty_table[1,2]+guilty_table[1,3]
[1] 0.5405405
guilty_table[2,2]+guilty_table[2,3]
[1] 0.5294118
guilty_table[3,2]+guilty_table[3,3]
[1] 0.5
clm_guilty <- ordinal::clm(responseCat ~ age,
data = d2 %>%
filter(capWording == "feel_guilty",
!is.na(responseCat),
character == "robot"))
summary(clm_guilty)
formula: responseCat ~ age
data: d2 %>% filter(capWording == "feel_guilty", !is.na(responseCat), character == "robot")
link threshold nobs logLik AIC niter max.grad cond.H
logit flexible 191 -113.71 233.42 7(0) 1.42e-10 1.2e+03
Coefficients:
Estimate Std. Error z value Pr(>|z|)
age -0.1834 0.0362 -5.065 4.09e-07 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Threshold coefficients:
Estimate Std. Error z value
no|kinda -1.6428 0.4161 -3.948
kinda|yes -0.6527 0.4109 -1.588
(4 observations deleted due to missingness)
# personality
personality_table <- with(d2 %>% filter(capWording == "have_a_personality",
!is.na(responseCat),
character == "robot") %>%
mutate(ageGroup3 = ifelse(ageGroup == "adult", "adult",
ifelse(is.na(age), NA,
ifelse(age < 8, "7",
ifelse(age < 9, "8",
"9"))))),
table(ageGroup3, responseCat)) %>%
prop.table(1)
personality_table
responseCat
ageGroup3 no kinda yes
7 0.25000000 0.22222222 0.52777778
8 0.23529412 0.32352941 0.44117647
9 0.29166667 0.33333333 0.37500000
adult 0.62745098 0.30392157 0.06862745
personality_table[3,2]+personality_table[3,3]
[1] 0.7083333
# self-control
self_control_table <- with(d2 %>% filter(capWording == "have_self-control",
!is.na(responseCat),
character == "robot") %>%
mutate(ageGroup3 = ifelse(ageGroup == "adult", "adult",
ifelse(is.na(age), NA,
ifelse(age < 8, "7",
ifelse(age < 9, "8",
"9"))))),
table(ageGroup3, responseCat)) %>%
prop.table(1)
self_control_table
responseCat
ageGroup3 no kinda yes
7 0.2777778 0.2222222 0.5000000
8 0.2857143 0.2857143 0.4285714
9 0.3333333 0.1666667 0.5000000
adult 0.5643564 0.2673267 0.1683168
self_control_table[1,2]+self_control_table[1,3]
[1] 0.7222222
self_control_table[2,2]+self_control_table[2,3]
[1] 0.7142857
self_control_table[3,2]+self_control_table[3,3]
[1] 0.6666667
clm_self_control <- ordinal::clm(responseCat ~ age,
data = d2 %>%
filter(capWording == "have_self-control",
!is.na(responseCat),
character == "robot"))
summary(clm_self_control)
formula: responseCat ~ age
data:
d2 %>% filter(capWording == "have_self-control", !is.na(responseCat), character == "robot")
link threshold nobs logLik AIC niter max.grad cond.H
logit flexible 192 -198.17 402.34 4(0) 2.02e-08 3.6e+03
Coefficients:
Estimate Std. Error z value Pr(>|z|)
age -0.03914 0.01013 -3.863 0.000112 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Threshold coefficients:
Estimate Std. Error z value
no|kinda -1.12987 0.25948 -4.354
kinda|yes -0.02018 0.24554 -0.082
(4 observations deleted due to missingness)
# MORE GENERAL
at_least_kinda_9y <- d2 %>%
filter(!is.na(responseCat),
ageGroup == "child",
!is.na(age),
age > 9) %>%
distinct() %>%
count(character, capacity, responseCat) %>%
group_by(character, capacity) %>%
mutate(prop_n = n/sum(n, na.rm = T)) %>%
select(-n) %>%
spread(responseCat, prop_n) %>% # n) %>%
mutate(at_least_kinda = sum(kinda, yes)) %>%
left_join(efa_comb_small_rot_loadings) %>%
arrange(factor, desc(at_least_kinda))
Joining, by = "capacity"
joining character vector and factor, coercing into character vector
at_least_kinda_9y %>%
select(character:at_least_kinda, factor, loading)
at_least_kinda_adult <- d2 %>%
filter(!is.na(responseCat),
character == "robot",
ageGroup == "adult") %>%
distinct() %>%
count(capacity, responseCat) %>%
group_by(capacity) %>%
mutate(prop_n = n/sum(n, na.rm = T)) %>%
select(-n) %>%
spread(responseCat, prop_n) %>% # n) %>%
mutate(at_least_kinda = sum(kinda, yes)) %>%
left_join(efa_comb_small_rot_loadings) %>%
arrange(factor, desc(at_least_kinda))
Joining, by = "capacity"
joining character vector and factor, coercing into character vector
at_least_kinda_adult %>%
select(capacity:at_least_kinda, factor, loading)
BIG TABLE
# make dataframe
big_table <- efa_adult_small_rot_loadings %>%
setNames(paste0('adult_', names(.))) %>%
rename(capacity = adult_capacity,
capWording = adult_capWording) %>%
full_join(efa_child_small_rot_loadings %>%
setNames(paste0('child_', names(.))) %>%
rename(capacity = child_capacity,
capWording = child_capWording)) %>%
full_join(efa_comb_small_rot_loadings %>%
setNames(paste0('comb_', names(.))) %>%
rename(capacity = comb_capacity,
capWording = comb_capWording)) %>%
arrange(comb_factor, desc(comb_loading_abs)) %>%
mutate(capWording = gsub("_", " ", capWording)) %>%
select(capWording,
adult_F2, child_F1, comb_F1, # double-check adults!
adult_F1, child_F2, comb_F2, # double-check adults!
adult_F3, child_F3, comb_F3) %>%
column_to_rownames(var = "capWording") %>%
signif(3) %>%
round(2)
Joining, by = c("capacity", "capWording")
Joining, by = c("capacity", "capWording")
big_table
cor.ci(scores_all %>% column_to_rownames(var = "subid") %>% select(-ageGroup))
Call:corCi(x = x, keys = keys, n.iter = n.iter, p = p, overlap = overlap,
poly = poly, method = method, plot = plot)
Coefficients and bootstrapped confidence intervals
sc_F1 sc_F2 sc_F3
score_F1 1.00
score_F2 0.28 1.00
score_F3 0.30 -0.03 1.00
scale correlations and bootstrapped confidence intervals
lower.emp lower.norm estimate upper.norm upper.emp p
sc_F1-sc_F2 0.18 0.19 0.28 0.36 0.35 0.00
sc_F1-sc_F3 0.23 0.22 0.30 0.39 0.39 0.00
sc_F2-sc_F3 -0.11 -0.12 -0.03 0.06 0.07 0.53

# by condition
d1_bycond3 <- d2 %>%
left_join(d_child02 %>% select(subid, age)) %>%
select(character, capacity, capWording, responseCat, subid, ageGroup, age) %>%
filter(capacity != "na", !is.na(responseCat)) %>%
mutate(capWording = gsub(" --.*", "", capWording),
ageGroup3 = ifelse(ageGroup == "adult", "adult",
ifelse(is.na(age), NA,
ifelse(age < 8, "7y",
ifelse(age < 9, "8y",
ifelse(age < 10, "9y",
NA)))))) %>%
distinct()
Joining, by = c("subid", "age")
joining factors with different levels, coercing to character vector
d1_bycond3 %>% select(ageGroup3, subid) %>% distinct() %>% count(ageGroup3)
# make df for plotting
d1_bycond3_mb_factorsAll <- d1_bycond3 %>%
full_join(efa_comb_small_rot_loadings %>%
group_by(factor) %>%
mutate(order = rank(desc(loading_abs)))) %>%
arrange(character, factor, desc(loading_abs)) %>%
rownames_to_column(var = "full_order") %>%
mutate(full_order = as.numeric(full_order)) %>%
arrange(factorName, full_order) %>%
ungroup() %>%
filter(!is.na(ageGroup3)) %>%
mutate(factorName = factor(factorName,
levels = c("Factor 1", "Factor 2", "Factor 3"),
labels = c("Social-emotional",
"Physiological",
"Perceptual-cognitive")),
agentic = ifelse(capWording %in% c("decide_what_to_do", "make_choices", "have_self_control",
"make_plans", "have_goals",
"understand_how_somebody_else_is_feeling",
"know_what's_nice_and_what's_mean", "have_thoughts",
"remember_things", "communicate_with_somebody_else"),
TRUE, FALSE))
Joining, by = c("capacity", "capWording")
joining character vector and factor, coercing into character vector
d1_bycond3_annotate <- d1_bycond3_mb_factorsAll %>%
filter(order <= 4) %>%
select(character, order, capWording) %>%
distinct()
# ggplot(d1_bycond3_mb_factorsAll %>% filter(order <= 4),
# aes(x = interaction(ageGroup3, desc(order*2)),
# # y = responseCat,
# # color = ageGroup3, shape = ageGroup3,
# fill = responseCat,
# label = ageGroup3)) +
# # label = gsub("_", " ", paste(capWording, ageGroup3, sep = ": ")))) +
# # facet_grid(factorName ~ character * order, scales = "free", space = "free") +
# facet_grid(factorName ~ character, scales = "free", space = "free") +
# geom_bar(position = "fill") +
# geom_text(aes(y = -0.5, hjust = 0),
# color = "black",
# # color = d1_bycond2_mb_factorsAll$textColor,
# size = 8) +
# geom_text(aes(x = order, y = 1.5, label = capWording), hjust = -1) +
# # annotate("text", aes(facet = order, label = d1_bycond3_annotate$capWording)) +
# labs(title = "Responses by mental capacity item",
# y = "Relative frequency",
# x = "Capacity * Age group",
# fill = "Response: ") +
# scale_y_continuous(breaks = c(0, 0.5, 1)) +
# # coord_flip() +
# theme_bw() +
# theme(text = element_text(size = 28),
# # axis.title.y = element_blank(),
# axis.text.y = element_blank(),
# axis.ticks.y = element_blank(),
# legend.position = "top") # 1700 by 2000
ggplot(d1_bycond3_mb_factorsAll %>%
filter(order <= 5) %>%
mutate(facet = tools::toTitleCase(paste0(character, " (", ageGroup, ")"))),
# mutate(facet = tools::toTitleCase(paste(ageGroup, character, sep = ": "))),
aes(x = desc(order*2),
fill = character,
alpha = responseCat,
# fill = responseCat,
label = gsub("_", " ", capWording))) +
facet_grid(factorName ~ facet) + #, scales = "free", space = "free") +
geom_bar(position = "stack", color = "black") +
scale_alpha_manual(values=c(0.4, 0.7, 1)) +
geom_text(aes(y = 5, hjust = 0),
color = "black",
# color = d1_bycond2_mb_factorsAll$textColor,
size = 8) +
labs(title = "Responses by mental capacity item",
y = "Count",
x = "Capacity",
alpha = "Response: ",
fill = "Character: ") +
coord_flip() +
theme_bw() +
theme(text = element_text(size = 28),
# axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
legend.position = "top") # 2000 by 1200

ggplot(d1_bycond3_mb_factorsAll %>%
# filter(order <= 10) %>%
# filter(order <= 5 | capWording %in% c("know_what's_nice_and_what's_mean",
# "make_choices")) %>% # add selected agency by factor
mutate(facet = tools::toTitleCase(paste0(character, " (", ageGroup, ")"))),
# mutate(facet = tools::toTitleCase(paste(ageGroup, character, sep = ": "))),
aes(x = desc(order*2),
fill = character,
alpha = responseCat,
# fill = responseCat,
label = gsub("_", " ", capWording))) +
facet_grid(factorName ~ facet, scales = "free", space = "free") +
geom_bar(position = "stack", color = "black") +
scale_alpha_manual(values=c(0.4, 0.7, 1)) +
geom_text(aes(y = 5, hjust = 0),
color = "black",
# color = d1_bycond2_mb_factorsAll$textColor,
size = 8) +
labs(title = "Responses by mental capacity item",
y = "Count",
x = "Capacity",
alpha = "Response: ",
fill = "Character: ") +
coord_flip() +
theme_bw() +
theme(text = element_text(size = 32),
# axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
legend.position = "top") # 2000 by 1200

d_srcd <- d1_bycond3_mb_factorsAll %>%
filter(factor == "F1", order <= 5) %>%
select(ageGroup, character, responseCat, order, capWording) %>%
mutate(labeller = ifelse(responseCat == "no", gsub("_", " ", capWording), NA)) %>%
distinct()
ggplot(d1_bycond3_mb_factorsAll %>%
filter(factor == "F1", order <= 5) %>%
mutate(facet = tools::toTitleCase(paste(ageGroup, character, sep = ": "))),
aes(x = desc(order*2),
fill = character,
alpha = responseCat,
label = gsub("_", " ", capWording))) +
facet_grid(factorName ~ facet) + #, scales = "free", space = "free") +
geom_bar(position = "stack", color = "black") +
scale_alpha_manual(values=c(0.2, 0.5, 1)) +
# scale_alpha_manual(values=c(0.4, 0.7, 1)) +
geom_text(data = d_srcd,
aes(x = desc(order*2), label = labeller, y = 5),
hjust = 0, angle = 90, color = "black", size = 8, alpha = 1) +
labs(title = "Responses by mental capacity item",
y = "Count",
x = "Capacity",
alpha = "Response: ",
fill = "Character: ") +
theme_bw() +
theme(text = element_text(size = 28),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
legend.position = "bottom") # 1000 by 500

d_srcd2 <- d1_bycond3_mb_factorsAll %>%
filter(factor == "F1", order <= 5, character == "robot") %>%
select(ageGroup, character, responseCat, order, capWording) %>%
mutate(labeller = ifelse(responseCat == "no", gsub("_", " ", capWording), NA)) %>%
distinct()
ggplot(d1_bycond3_mb_factorsAll %>%
filter(factor == "F1", order <= 5) %>%
mutate(facet = tolower(paste(ageGroup, character, sep = ": "))) %>%
mutate(facet = factor(facet,
levels = c("child: beetle", "child: robot",
"adult: beetle", "adult: robot"),
labels = c("children: beetle", "children: robot",
"adults: beetle", "adults: robot"))) %>%
mutate(ageGroup2 = factor(ageGroup, levels = c("child", "adult"),
labels = c("children", "adults"))),
aes(x = desc(order*2),
fill = character,
alpha = responseCat,
label = gsub("_", " ", capWording))) +
facet_grid(~ facet) + #, scales = "free", space = "free") +
geom_bar(position = "stack", color = "black") +
scale_alpha_manual(values=c(0.2, 0.5, 1)) +
# scale_alpha_manual(values=c(0.4, 0.7, 1)) +
geom_text(data = d_srcd2,
aes(x = desc(order*2), label = labeller, y = 5),
hjust = 0, angle = 90, color = "black", size = 8, alpha = 1) +
labs(y = "Count",
x = "Capacity",
alpha = "Response: ",
fill = "Character: ") +
labs(title = "Responses (raw counts)",
y = "Count",
x = "Capacity",
alpha = "response: ",
fill = "character: ") +
theme_bw() +
theme(text = element_text(size = 28),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
legend.position = "bottom") # 1000 by 500

ggplot(d1_bycond3_mb_factorsAll %>%
filter(factor == "F1", order <= 5, character == "robot") %>%
mutate(facet = tools::toTitleCase(paste(ageGroup, character, sep = ": "))) %>%
mutate(facet = factor(facet,
levels = c("Child: Robot", "Adult: Robot"),
labels = c("Children: robot", "Adults: robot"))) %>%
mutate(ageGroup2 = factor(ageGroup, levels = c("child", "adult"),
labels = c("children", "adults"))),
aes(x = desc(order*2),
alpha = responseCat,
label = gsub("_", " ", capWording))) +
facet_grid(~ ageGroup2) + #, scales = "free", space = "free") +
geom_bar(position = "stack", color = "black", fill = "#00BFC4") +
scale_alpha_manual(values=c(0.2, 0.5, 1)) +
# scale_alpha_manual(values=c(0.4, 0.7, 1)) +
geom_text(data = d_srcd2,
aes(x = desc(order*2), label = labeller, y = 5),
hjust = 0, angle = 90, color = "black", size = 8, alpha = 1) +
labs(y = "Count",
x = "Capacity",
alpha = "Response: ",
fill = "Character: ") +
theme_bw() +
theme(text = element_text(size = 28),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
legend.position = "bottom") # 600 by 500

LS0tCnRpdGxlOiAiRGlta2lkIGFuYWx5c2lzIgphdXRob3I6ICJLYXJhIFdlaXNtYW4iCmRhdGU6ICIxLzIyLzIwMTciCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdAotLS0KCiMgUHJlbGltaW5hcmllcwoKIyMgU2V0IHVwIGVudmlyb25tZW50CgpgYGB7ciBwcmVsaW19CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGxhbmdjb2cpCmxpYnJhcnkoc3RhdHMpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoR1BBcm90YXRpb24pCmxpYnJhcnkobG1lNCkKbGlicmFyeShSQ29sb3JCcmV3ZXIpCgojIGNsZWFyIGVudmlyb25tZW50CnJtKGxpc3Q9bHMoKSkKZ3JhcGhpY3Mub2ZmKCkKYGBgCgojIyBSZWFkIGluIGRhdGEKCmBgYHtyIHJlYWRpbmd9CiMgQURVTFQgcnVuIDAxICgzLXBvaW50IHNjYWxlKQpkX2FkdWx0MDEgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9EaW1raWQvZGlta2lkL2RhdGEvYWR1bHRzL3VzX3J1bi0wMV8yMDE2LTA2LTA1X2Fub255bWl6ZWQuY3N2IikgJT4lIHNlbGVjdCgtWCkKCiMgIyBBRFVMVCBydW4gMDIgKDctcG9pbnQgc2NhbGUpCiMgZF9hZHVsdDAyIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvRGlta2lkL2RpbWtpZC9kYXRhL2FkdWx0cy91c19ydW4tMDJfMjAxNi0wNy0xOV9hbm9ueW1pemVkLmNzdiIpICU+JSBzZWxlY3QoLVgpCiMgCiMgIyBBRFVMVCBydW4gMDMgKDMtcG9pbnQgc2NhbGUsIG9yaWdpbmFsIHdvcmRpbmcgZm9yICdmcmVlIHdpbGwnIGFuZCAnaW50ZW50aW9ucycpCiMgZF9hZHVsdDAzIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvRGlta2lkL2RpbWtpZC9kYXRhL2FkdWx0cy91c19ydW4tMDNfMjAxNi0xMi0wOF9hbm9ueW1pemVkLmNzdiIpICU+JSBzZWxlY3QoLVgpCgojIENISUxEIHJ1biAwMSBbbHlkaWEsIG9saXZpYSwgYWxsaWUgKHN1bW1lciAyMDE2KSArIG5pY2t5LCBkcnUsIGFyaWVsLCBvbGl2aWEgKGZhbGwgMjAxNikgKyBjYW1wYmVsbCAod2ludGVyIDIwMTcpXQpkX2NoaWxkMDEgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9EaW1raWQvZGlta2lkL2RhdGEvY2hpbGRyZW4vcnVuLTAxXzIwMTctMDEtMTlfYW5vbnltaXplZC5jc3YiKSAlPiUgc2VsZWN0KC1YKQoKIyBkZW1vZ3JhcGhpYyBpbmZvIChmb3IgY2hpbGRyZW4pCmNoaWxkX2RlbW8gPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9EaW1raWQvZGlta2lkL2RhdGEvY2hpbGRyZW4vZGlta2lkX3BhcnRpY2lwYW50X2FnZXNfMjAxNy0wMS0xOS5jc3YiKQpgYGAKCiMjIFRpZHkgZGF0YQoKYGBge3IgdGlkeWluZ30KIyB0aWR5IGFkdWx0IHJ1biAwMQpkX2FkdWx0MDIgPC0gZF9hZHVsdDAxICU+JQogIHNlbGVjdChzdWJpZCwgYWdlLCBnZW5kZXIsIGV0aG5pY2l0eSwgZHVyYXRpb24sCiAgICAgICAgIGNoYXJOYW1lLCB0cmlhbE51bSwgY2FwYWNpdHksIGNhcFdvcmRpbmcsIAogICAgICAgICBob3ZlclRpbWUsIHJ0LCByZXNwb25zZSwgcmVzcG9uc2VOdW0pICU+JQogIHJlbmFtZShjaGFyYWN0ZXIgPSBjaGFyTmFtZSwKICAgICAgICAgc2Vzc2lvbkR1cmF0aW9uID0gZHVyYXRpb24pICU+JQogIG11dGF0ZShhZ2VHcm91cCA9ICJhZHVsdCIpCgojIHRpZHkgZGVtb2dyYXBoaWNzCmNoaWxkX2RlbW9fdGlkeSA8LSBjaGlsZF9kZW1vICU+JQogIG11dGF0ZShzdWJpZCA9IGdzdWIoIiAiLCAiIiwgc3ViaWQpKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCItIiwgIiIsIHN1YmlkKSkgJT4lCiAgbXV0YXRlKHN1YmlkID0gdG91cHBlcihzdWJpZCkpICU+JQogIHNlbGVjdChzdWJpZCwgYWdlLCBnZW5kZXIsIGV0aG5pY2l0eSkKCiMgdGlkeSBjaGlsZCBydW4gMDEKZF9jaGlsZDAyIDwtIGRfY2hpbGQwMSAlPiUKICBmaWx0ZXIoY2hhcmFjdGVyICVpbiUgYygiYmVldGxlIiwgInJvYm90IikpICAlPiUgIyBubyBlbGVwaGFudCBjb25kaXRpb24hIChuID0gMSBjaGlsZCkKICBzZWxlY3Qoc3ViaWQsIHNlc3Npb25EdXJhdGlvbiwKICAgICAgICAgY2hhcmFjdGVyLCB0cmlhbE51bSwgY2FwYWNpdHksIGNhcFdvcmRpbmcsIAogICAgICAgICBob3ZlclRpbWUsIHJ0LCByZXNwb25zZSwgcmVzcG9uc2VOdW0pICU+JQogIG11dGF0ZShhZ2VHcm91cCA9ICJjaGlsZCIpICU+JQogIG11dGF0ZShzdWJpZCA9IGdzdWIoIiAiLCAiIiwgc3ViaWQpKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCItIiwgIiIsIHN1YmlkKSkgJT4lCiAgbXV0YXRlKHN1YmlkID0gdG91cHBlcihzdWJpZCkpICU+JQogIGxlZnRfam9pbihjaGlsZF9kZW1vX3RpZHkpICU+JQogIG11dGF0ZShzdWJpZCA9IGZhY3Rvcihhcy5jaGFyYWN0ZXIoc3ViaWQpKSkKCiMgY29tYmluZSBkYXRhc2V0cwpkIDwtIGRfYWR1bHQwMiAlPiUKICBmdWxsX2pvaW4oZF9jaGlsZDAyKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBmYWN0b3Ioc3ViaWQpLAogICAgICAgICBjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSwKICAgICAgICAgY2FwV29yZGluZyA9IGZhY3Rvcihnc3ViKCJcXCAiLCAiXyIsIGdzdWIoIiAtLS4qIiwgIiIsIGNhcFdvcmRpbmcpKSksCiAgICAgICAgIHJlc3BvbnNlQ2F0ID0gZmFjdG9yKHJlc3BvbnNlLCBsZXZlbHMgPSBjKCJubyIsICJraW5kYSIsICJ5ZXMiKSksCiAgICAgICAgIHJlc3BvbnNlTnVtID0gaWZlbHNlKHJlc3BvbnNlID09ICJubyIsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShyZXNwb25zZSA9PSAia2luZGEiLCAwLjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocmVzcG9uc2UgPT0gInllcyIsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSksCiAgICAgICAgIGFnZUdyb3VwID0gZmFjdG9yKGFnZUdyb3VwLCBsZXZlbHMgPSBjKCJhZHVsdCIsICJjaGlsZCIpKSkgJT4lCiAgZGlzdGluY3QoKQpgYGAKIyBEZW1vZ3JhcGhpY3MKCmBgYHtyIG4gcGFydGljaXBhbnRzfQojIHRvdGFsIG4KZCAlPiUgCiAgc2VsZWN0KGFnZUdyb3VwLCBzdWJpZCwgYWdlKSAlPiUKICBkaXN0aW5jdCgua2VlcF9hbGwgPSBUKSAlPiUKICBtdXRhdGUoYWdlR3JvdXAyID0gaWZlbHNlKGFnZUdyb3VwID09ICJhZHVsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFnZSA8IDcgfCBhZ2UgPiAxMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dCBvZiBhZ2UgcmFuZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShpcy5uYShhZ2UpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pc3NpbmcgYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaWxkIikpKSkgJT4lCiAgY291bnQoYWdlR3JvdXAyKQoKIyBkcm9wIGNoaWxkcmVuIG91dHNpZGUgb2YgdGFyZ2V0IGFnZSByYW5nZSAoNy05eSkKZDEgPC0gZCAlPiUKICBmaWx0ZXIoKGFnZSA+PSA3ICYgYWdlIDw9IDEwKSB8IGFnZUdyb3VwID09ICJhZHVsdCIpCgpkMSAlPiUgCiAgc2VsZWN0KGFnZUdyb3VwLCBzdWJpZCwgYWdlKSAlPiUKICBkaXN0aW5jdCgua2VlcF9hbGwgPSBUKSAlPiUKICAgIG11dGF0ZShhZ2VHcm91cDIgPSBpZmVsc2UoYWdlR3JvdXAgPT0gImFkdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHVsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYWdlIDwgNyB8IGFnZSA+IDEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0IG9mIGFnZSByYW5nZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGlzLm5hKGFnZSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlzc2luZyBhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbGQiKSkpKSAlPiUKICBjb3VudChhZ2VHcm91cDIpCmBgYAoKYGBge3IgY29uZGl0aW9ufQojIGNvbmRpdGlvbgpkMSAlPiUgCiAgc2VsZWN0KGFnZUdyb3VwLCBzdWJpZCwgY2hhcmFjdGVyKSAlPiUKICBkaXN0aW5jdCgua2VlcF9hbGwgPSBUKSAlPiUKICBjb3VudChhZ2VHcm91cCwgY2hhcmFjdGVyKQpgYGAKCmBgYHtyIGFnZX0KIyBhZ2UgCmQxICU+JSAKICBzZWxlY3QoYWdlR3JvdXAsIHN1YmlkLCBhZ2UpICU+JQogIGRpc3RpbmN0KC5rZWVwX2FsbCA9IFQpICU+JQogIGdyb3VwX2J5KGFnZUdyb3VwKSAlPiUKICBzdW1tYXJpc2UobWVhbl9hZ2UgPSBtZWFuKGFnZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgc2RfYWdlID0gc2QoYWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBtZWRpYW5fYWdlID0gbWVkaWFuKGFnZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWluX2FnZSA9IG1pbihhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgIG1heF9hZ2UgPSBtYXgoYWdlLCBuYS5ybSA9IFQpKQoKIyBwbG90IGNoaWxkcmVuJ3MgYWdlCnFwbG90KGQxICU+JSAKICAgICAgICBmaWx0ZXIoYWdlR3JvdXAgPT0gImNoaWxkIikgJT4lCiAgICAgICAgZGlzdGluY3Qoc3ViaWQsIC5rZWVwX2FsbCA9IFQpICU+JSAKICAgICAgICBzZWxlY3QoYWdlKSwgYmlucyA9IDE4KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGQxJGFnZVtkMSRhZ2VHcm91cCA9PSAiY2hpbGQiXSwgbmEucm0gPSBUKSwgY29sb3IgPSAicmVkIikKCiMgY2hlY2sgY2hpbGRyZW4ncyBhZ2UgYnkgY29uZGl0aW9uCmQxICU+JSAKICBmaWx0ZXIoYWdlR3JvdXAgPT0gImNoaWxkIikgJT4lCiAgZGlzdGluY3Qoc3ViaWQsIC5rZWVwX2FsbCA9IFQpICU+JSAKICBzZWxlY3QoYWdlLCBjaGFyYWN0ZXIpICU+JQogIGdyb3VwX2J5KGNoYXJhY3RlcikgJT4lIAogIHN1bW1hcmlzZShtZWRpYW4gPSBtZWRpYW4oYWdlLCBuYS5ybSA9IFQpKQoKdC50ZXN0KGFnZSB+IGNoYXJhY3RlciwgCiAgICAgICBkMSAlPiUgCiAgICAgICAgIGZpbHRlcihhZ2VHcm91cCA9PSAiY2hpbGQiKSAlPiUKICAgICAgICAgc2VsZWN0KHN1YmlkLCBhZ2UsIGNoYXJhY3RlcikgJT4lIAogICAgICAgICBkaXN0aW5jdCkKCmdncGxvdChkMSAlPiUKICAgICAgICAgZmlsdGVyKGFnZUdyb3VwID09ICJjaGlsZCIpICU+JQogICAgICAgICBkaXN0aW5jdChzdWJpZCwgLmtlZXBfYWxsID0gVCkgJT4lIAogICAgICAgICBzZWxlY3QoYWdlLCBjaGFyYWN0ZXIpICU+JQogICAgICAgICBncm91cF9ieShjaGFyYWN0ZXIpICU+JQogICAgICAgICBtdXRhdGUobWVkaWFuX2FnZSA9IG1lZGlhbihhZ2UsIG5hLnJtID0gVCkpLAogICAgICAgYWVzKHggPSBhZ2UpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDkpICsKICBmYWNldF93cmFwKH4gY2hhcmFjdGVyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGQkYWdlW2QkYWdlR3JvdXAgPT0gImNoaWxkIl0sIG5hLnJtID0gVCksIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWRpYW5fYWdlLCBjb2xvciA9IGNoYXJhY3RlciksIGx0eSA9IDIpCmBgYAoKYGBge3IgZHVyYXRpb259CiMgZHVyYXRpb24KZDEgJT4lCiAgZ3JvdXBfYnkoYWdlR3JvdXApICU+JQogIHN1bW1hcmlzZShtZWFuID0gbWVhbihzZXNzaW9uRHVyYXRpb24sIG5hLnJtID0gVCksCiAgICAgICAgICAgIG1lZGlhbiA9IG1lZGlhbihzZXNzaW9uRHVyYXRpb24sIG5hLnJtID0gVCksCiAgICAgICAgICAgIG1pbiA9IG1pbihzZXNzaW9uRHVyYXRpb24sIG5hLnJtID0gVCksCiAgICAgICAgICAgIG1heCA9IG1heChzZXNzaW9uRHVyYXRpb24sIG5hLnJtID0gVCkpCgojIHBsb3QgZHVyYXRpb24gYnkgYWdlIGdyb3VwIGFuZCBjaGFyYWN0ZXIKZ2dwbG90KGQxLCBhZXMoc2Vzc2lvbkR1cmF0aW9uKSkgKwogIGZhY2V0X2dyaWQoY2hhcmFjdGVyIH4gYWdlR3JvdXApICsKICBnZW9tX2hpc3RvZ3JhbShicmVha3MgPSAwOjE1KQoKdC50ZXN0KHNlc3Npb25EdXJhdGlvbiB+IGNoYXJhY3RlciwKICAgICAgIGQxICU+JQogICAgICAgICBmaWx0ZXIoYWdlR3JvdXAgPT0gImNoaWxkIikgJT4lCiAgICAgICAgIHNlbGVjdChzdWJpZCwgY2hhcmFjdGVyLCBzZXNzaW9uRHVyYXRpb24pICU+JQogICAgICAgICBsZWZ0X2pvaW4oZCAlPiUgc2VsZWN0KHN1YmlkLCBzZXNzaW9uRHVyYXRpb24pKSAlPiUKICAgICAgICAgbXV0YXRlKHN1YmlkID0gYXMuY2hhcmFjdGVyKHN1YmlkKSwKICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IGZhY3RvcihjaGFyYWN0ZXIpLAogICAgICAgICAgICAgICAgc2Vzc2lvbkR1cmF0aW9uID0gcm91bmQoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc2Vzc2lvbkR1cmF0aW9uKSksIDMpKSAlPiUKICAgICAgICAgZGlzdGluY3QoKSkKCnQudGVzdChzZXNzaW9uRHVyYXRpb24gfiBjaGFyYWN0ZXIsCiAgICAgICBkMSAlPiUKICAgICAgICAgZmlsdGVyKGFnZUdyb3VwID09ICJhZHVsdCIpICU+JQogICAgICAgICBzZWxlY3Qoc3ViaWQsIGNoYXJhY3Rlciwgc2Vzc2lvbkR1cmF0aW9uKSAlPiUKICAgICAgICAgbGVmdF9qb2luKGQgJT4lIHNlbGVjdChzdWJpZCwgc2Vzc2lvbkR1cmF0aW9uKSkgJT4lCiAgICAgICAgIG11dGF0ZShzdWJpZCA9IGFzLmNoYXJhY3RlcihzdWJpZCksCiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSwKICAgICAgICAgICAgICAgIHNlc3Npb25EdXJhdGlvbiA9IHJvdW5kKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHNlc3Npb25EdXJhdGlvbikpLCAzKSkgJT4lCiAgICAgICAgIGRpc3RpbmN0KCkpCmBgYAoKYGBge3IgZ2VuZGVyfQojIGdlbmRlcgpkMSAlPiUKICBzZWxlY3QoYWdlR3JvdXAsIHN1YmlkLCBnZW5kZXIpICU+JQogIGRpc3RpbmN0KC5rZWVwX2FsbCA9IFQpICU+JQogIGNvdW50KGFnZUdyb3VwLCBnZW5kZXIpCmBgYAoKYGBge3IgZXRobmljaXR5fQojIGV0aG5pY2l0eQpkMSAlPiUgCiAgc2VsZWN0KGFnZUdyb3VwLCBzdWJpZCwgZXRobmljaXR5KSAlPiUKICBtdXRhdGUoZXRobmljaXR5ID0gdG9sb3dlcihldGhuaWNpdHkpKSAlPiUKICBtdXRhdGUoYmxhY2sgPSBncmVwbCgiYmxhY2siLCBldGhuaWNpdHkpIHwKICAgICAgICAgICBncmVwbCgiYWZyaWNhbiBhbWVyaWNhbiIsIGV0aG5pY2l0eSksCiAgICAgICAgIGVhc3RfYXNpYW4gPSBncmVwbCgiZWFzdCBhc2lhbiIsIGV0aG5pY2l0eSkgfAogICAgICAgICAgIGdyZXBsKCJlYXN0YXNpYW4iLCBldGhuaWNpdHkpIHwKICAgICAgICAgICBncmVwbCgiY2hpbmVzZSIsIGV0aG5pY2l0eSkgfAogICAgICAgICAgIGdyZXBsKCJjaGluYSIsIGV0aG5pY2l0eSkgfAogICAgICAgICAgIGdyZXBsKCJrb3JlYSIsIGV0aG5pY2l0eSkgfAogICAgICAgICAgIGdyZXBsKCJqYXBhbiIsIGV0aG5pY2l0eSkgfAogICAgICAgICAgIGdyZXBsKCJ0YWl3YW4iLCBldGhuaWNpdHkpLAogICAgICAgICBzb3V0aF9hc2lhbiA9IGdyZXBsKCJzb3V0aCBhc2lhbiIsIGV0aG5pY2l0eSkgfAogICAgICAgICAgIGdyZXBsKCJzb3V0aGFzaWFuIiwgZXRobmljaXR5KSB8CiAgICAgICAgICAgZ3JlcGwoImluZGlhIiwgZXRobmljaXR5KSB8CiAgICAgICAgICAgZ3JlcGwoInBha2lzdGFuIiwgZXRobmljaXR5KSB8CiAgICAgICAgICAgZ3JlcGwoImJhbmdsYSIsIGV0aG5pY2l0eSkgfAogICAgICAgICAgIGdyZXBsKCJzcmkgbGFua2EiLCBldGhuaWNpdHkpLAogICAgICAgICBsYXRpbm8gPSBncmVwbCgibGF0aW4iLCBldGhuaWNpdHkpIHwKICAgICAgICAgICBncmVwbCgiaGlzcGFuaWMiLCBldGhuaWNpdHkpIHwKICAgICAgICAgICBncmVwbCgibWV4aWMiLCBldGhuaWNpdHkpLAogICAgICAgICBtaWRkbGVfZWFzdGVybiA9IGdyZXBsKCJtaWRkbGUiLCBldGhuaWNpdHkpLAogICAgICAgICBwYWNfaXNsYW5kID0gZ3JlcGwoInBhY2lmaWMiLCBldGhuaWNpdHkpIHwKICAgICAgICAgICBncmVwbCgiaGF3YWlpIiwgZXRobmljaXR5KSwKICAgICAgICAgbmF0aXZlX2FtID0gZ3JlcGwoIm5hdGl2ZWFtZXJpY2FuIiwgZXRobmljaXR5KSB8CiAgICAgICAgICAgZ3JlcGwoIm5hdGl2ZSBhbWVyaWNhbiIsIGV0aG5pY2l0eSkgfAogICAgICAgICAgIGdyZXBsKCJhbWVyaWNhbiBpbmRpYW4iLCBldGhuaWNpdHkpIHwKICAgICAgICAgICBncmVwbCgiYWxhc2thIG5hdGl2ZSIsIGV0aG5pY2l0eSksCiAgICAgICAgIHdoaXRlID0gZ3JlcGwoIndoaXRlIiwgZXRobmljaXR5KSwKICAgICAgICAgb3RoZXIgPSBncmVwbCgib3RoZXIiLCBldGhuaWNpdHkpKSAlPiUKICBkaXN0aW5jdCgua2VlcF9hbGwgPSBUKSAlPiUKICBnYXRoZXIoZXRobmljaXR5VEYsIFRGLCAtc3ViaWQsIC1ldGhuaWNpdHksIC1hZ2VHcm91cCkgJT4lCiAgZmlsdGVyKFRGKSAlPiUKICBjb3VudChhZ2VHcm91cCwgZXRobmljaXR5VEYpCgojIE5PVEU6IG5vdCBtdXR1YWxseSBleGNsdXNpdmUhIQoKIyBtdXR1YWxseSBleGNsdXNpdmUgdmVyc2lvbgpkMSAlPiUgCiAgc2VsZWN0KGFnZUdyb3VwLCBzdWJpZCwgZXRobmljaXR5KSAlPiUKICBtdXRhdGUoZXRobmljaXR5ID0gdG9sb3dlcihldGhuaWNpdHkpKSAlPiUKICBkaXN0aW5jdCgua2VlcF9hbGwgPSBUKSAlPiUKICBtdXRhdGUoZXRobmljaXR5MiA9IGlmZWxzZShhZ2VHcm91cCA9PSAiYWR1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiLCIsIGV0aG5pY2l0eSksICJtdWx0aXBsZSIsIGV0aG5pY2l0eSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCI7IiwgZXRobmljaXR5KSwgIm11bHRpcGxlIiwgZXRobmljaXR5KSkpICU+JSAKICBtdXRhdGUoZXRobmljaXR5MyA9IGlmZWxzZShncmVwbCgib3RoZXIiLCBldGhuaWNpdHkyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIi8iLCBldGhuaWNpdHkyKSB8IGdyZXBsKCJtaXgiLCBldGhuaWNpdHkyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJhc2lhbiIsIGV0aG5pY2l0eTIpIHwgZ3JlcGwoImtvcmVhbiIsIGV0aG5pY2l0eTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVhc3QgYXNpYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRobmljaXR5MikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0aG5pY2l0eTIpKSAlPiUKICBjb3VudChhZ2VHcm91cCwgZXRobmljaXR5MykgJT4lCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KGFnZUdyb3VwKSAlPiUKICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICBhcnJhbmdlKGFnZUdyb3VwLCBkZXNjKG4pKQpgYGAKCmBgYHtyIG1pc3NpbmcgZGF0YX0KIyBleHBlcmltaW5ldGVyIGVycm9yCmRfY2hpbGQwMSAlPiUgIyB1c2UgZF9jaGlsZDAxIChiZWZvcmUgZHJvcHBpbmcgbiA9IDEgY2hpbGQgaW4gImVsZXBoYW50IiBjb25kaXRpb24pCiAgZmlsdGVyKCEoY2hhcmFjdGVyICVpbiUgYygiYmVldGxlIiwgInJvYm90IikpKSAlPiUKICBzZWxlY3Qoc3ViaWQpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgY291bnQoKSAlPiUKICBtdXRhdGUocGVyY2VudCA9IG4vMjAwKQoKIyBpbmNvbXBsZXRlIHRyaWFscyAoInNraXAiLCAiYmFpbCIpCmQxICU+JSAjIHVzZSBkMSAoYmVmb3JlIGRyb3BwaW5nIHRyaWFscyB3aXRoIHJ0ID4gMjUwbXMpIAogIGNvdW50KGFnZUdyb3VwLCBzdWJpZCkgJT4lCiAgZmlsdGVyKG4gIT0gNDApICU+JQogIG11dGF0ZShuX21pc3NpbmcgPSA0MC1uKSAlPiUKICBncm91cF9ieShhZ2VHcm91cCkgJT4lCiAgc3VtbWFyaXNlKHN1bV9taXNzaW5nID0gc3VtKG5fbWlzc2luZykpICU+JQogIG11dGF0ZShwZXJjZW50ID0gc3VtX21pc3NpbmcvODAwMCkKCiMgdHJpYWxzIHdpdGggcnQgPiAyNTBtcwpkMSAlPiUKICBmaWx0ZXIocnQgPCAyNTApICU+JQogIGNvdW50KGFnZUdyb3VwKSAlPiUKICBtdXRhdGUocGVyY2VudCA9IG4vODAwMCkKCiMgYWxsIG1pc3NpbmcgdHJpYWxzCmQxICU+JSAjIHVzZSBkMSAoYmVmb3JlIGRyb3BwaW5nIHRyaWFscykgCiAgY291bnQoYWdlR3JvdXAsIHN1YmlkKSAlPiUKICBmaWx0ZXIobiAhPSA0MCkgJT4lCiAgbXV0YXRlKG5fTkEgPSA0MC1uKSAlPiUKICBncm91cF9ieShhZ2VHcm91cCkgJT4lCiAgc3VtbWFyaXNlKG5fTkEgPSBzdW0obl9OQSkpICU+JQogIG11dGF0ZShwZXJjZW50X05BID0gbl9OQS84MDAwKSAlPiUKICBmdWxsX2pvaW4oZDEgJT4lCiAgICAgICAgICAgICAgZmlsdGVyKHJ0IDwgMjUwKSAlPiUKICAgICAgICAgICAgICBjb3VudChhZ2VHcm91cCkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKG5fZmFzdCA9IG4pICU+JQogICAgICAgICAgICAgIG11dGF0ZShwZXJjZW50X2Zhc3QgPSBuX2Zhc3QvODAwMCkpICU+JQogIG11dGF0ZShuX21pc3NpbmdfVE9UQUwgPSBuX05BICsgbl9mYXN0LAogICAgICAgICBwZXJjZW50X21pc3NpbmdfVE9UQUwgPSBwZXJjZW50X05BICsgcGVyY2VudF9mYXN0KQogIApgYGAKCiMgRGF0YSBwcmVwYXJhdGlvbgoKIyMgRmlsdGVyIFJUcwoKYGBge3IgZmlsdGVyIFJUcywgcHJlcCBkYXRhZnJhbWV9CiMgZXhhbWluZSBhbmQgZmlsdGVyIGJ5IFJUcwpnZ3Bsb3QoZDEpICsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeCA9IHJ0KSwgYmlucyA9IDEwMCkgKwogIGZhY2V0X3dyYXAofmFnZUdyb3VwKSArCiAgc2NhbGVfeF9sb2cxMChicmVha3MgPSBzZXEoMCwgMTAwMCwgMTAwKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDI1MCwgY29sb3IgPSAicmVkIikKCmQyIDwtIGQxICU+JQogIGZpbHRlcighKHJ0IDwgMjUwKSB8IGlzLm5hKHJ0KSkgIyBwcmVzZXQgY3JpdGVyaW9uIG9mIDI1MG1zCmBgYAoKIyMgTG9vayBhdCBob3ZlciB0aW1lCgpgYGB7ciBob3ZlciB0aW1lfQpkMiAlPiUKICBmaWx0ZXIoIShjYXBhY2l0eSAlaW4lIGMoInBlcnNvbmFsaXR5IiwgImJlbGllZnMiLCAicGxlYXN1cmUiLCAiZGVzaXJlcyIsICJzZWxmX3Jlc3RyYWludCIsICJnb2FscyIsICJuYXVzZWF0ZWQiKSkpICU+JQogIG11dGF0ZShub0hvdmVyID0gaG92ZXJUaW1lID09IDApICU+JQogIGNvdW50KGFnZUdyb3VwLCBub0hvdmVyKSAlPiUKICBncm91cF9ieShhZ2VHcm91cCkgJT4lCiAgbXV0YXRlKHBlcmNlbnQgPSBuL3N1bShuKSkKCmdncGxvdChkMiwgYWVzKHggPSBob3ZlclRpbWUpKSArCiAgZmFjZXRfZ3JpZCh+IGFnZUdyb3VwKSArCiAgZ2VvbV9oaXN0b2dyYW0oKQpgYGAKCiMjIFByZXBhcmUgZGF0YSBmb3IgRUZBCgpgYGB7ciBwcmVwIGZvciBlZmF9CiMgZmluaXNoIHRpZHlpbmcKZDMgPC0gZDIgJT4lCiAgc2VsZWN0KGNhcGFjaXR5LCByZXNwb25zZU51bSwgc3ViaWQpICU+JQogIHNwcmVhZChjYXBhY2l0eSwgcmVzcG9uc2VOdW0pCgojIG1ha2UgY29tYmluZWQgZGF0YXNldApkM19jb21iaW5lZCA8LSBkYXRhLmZyYW1lKGQzWywtMV0sIHJvdy5uYW1lcyA9IGQzWywxXSkKCiMgbWFrZSBzZXBhcmF0ZSBjaGlsZCBhbmQgYWR1bHQgZGF0YXNldHMKZDNfYWR1bHQgPC0gZDMgJT4lCiAgbGVmdF9qb2luKGQgJT4lIHNlbGVjdChzdWJpZCwgYWdlR3JvdXApKSAlPiUKICBmaWx0ZXIoYWdlR3JvdXAgPT0gImFkdWx0IikgJT4lCiAgc2VsZWN0KC1hZ2VHcm91cCkgJT4lCiAgZGlzdGluY3QoKQpkM19hZHVsdCA8LSBkYXRhLmZyYW1lKGQzX2FkdWx0WywtMV0sIHJvdy5uYW1lcyA9IGQzX2FkdWx0WywxXSkKCmQzX2NoaWxkIDwtIGQzICU+JQogIGxlZnRfam9pbihkICU+JSBzZWxlY3Qoc3ViaWQsIGFnZUdyb3VwKSkgJT4lCiAgZmlsdGVyKGFnZUdyb3VwID09ICJjaGlsZCIpICU+JQogIHNlbGVjdCgtYWdlR3JvdXApICU+JQogIGRpc3RpbmN0KCkKZDNfY2hpbGQgPC0gZGF0YS5mcmFtZShkM19jaGlsZFssLTFdLCByb3cubmFtZXMgPSBkM19jaGlsZFssMV0pCmBgYAoKIyMgR2VuZXJhbCBhbmFseXNpcyBzZXR0aW5ncwoKYGBge3IgYW5hbHlzaXMgc2V0dGluZ3N9CiMgc2V0IGNvcnJlbGF0aW9uIHR5cGU6IHBlYXJzb24gb3IgcG9seWNob3JpYz8KY29yX3R5cGUgPC0gImNvciIKIyBjb3JfdHlwZSA8LSAicG9seSIKCiMgc2V0IHJvdGF0aW9uIHR5cGU6IHZhcmltYXggb3Igb2JsaW1pbj8KIyByb3RfdHlwZSA8LSAidmFyaW1heCIKcm90X3R5cGUgPC0gIm9ibGltaW4iCgojIHNldCBzY29yZSB0eXBlCiMgc2NvcmVfdHlwZSA8LSAicmVncmVzc2lvbiIKc2NvcmVfdHlwZSA8LSAiVGh1cnN0b25lIgojIHNjb3JlX3R5cGUgPC0gInRlbkJlcmdlIgojIHNjb3JlX3R5cGUgPC0gIkFuZGVyc29uIgojIHNjb3JlX3R5cGUgPC0gIkJhcnRsZXR0IgojIHNjb3JlX3R5cGUgPC0gIkhhcm1hbiIKYGBgCgojIEFkdWx0cyBhbG9uZQoKIyMgRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzCgojIyMgTWF4aW1hbCAoMTMtZmFjdG9yKSB1bnJvdGF0ZWQgc29sdXRpb24KCmBgYHtyIGVmYSBhZHVsdHMgbWF4aW1hbCB1bnJvdGF0ZWR9CiMgZG8gZmFjdG9yIGFuYWx5c2lzCmVmYV9hZHVsdF9tYXhfdW5yb3QgPC0gZmEoZDNfYWR1bHQsIG5mYWN0b3JzID0gMTMsIHJvdGF0ZSA9ICJub25lIiwgY29yID0gY29yX3R5cGUpCmVmYV9hZHVsdF9tYXhfdW5yb3QKCiMgZXhhbWluZSBlaWdlbnZhbHVlcyBhbmQgdmFyaWFuY2UgZXhwbGFpbmVkCmVmYV9hZHVsdF9tYXhfdW5yb3RfZWlnZW52YWx1ZXMgPC0gcHJpbnQoZWZhX2FkdWx0X21heF91bnJvdCkkVmFjY291bnRlZCAlPiUKICB0KCkgJT4lCiAgZGF0YS5mcmFtZSgpCgojIGNvdW50IGZhY3RvcnMgd2l0aCBlaWdlbnZhbHVlcyA+IDEgYW5kIHZhcmlhbmNlIGV4cGxhaW5lZCA+IDUlCmVmYV9hZHVsdF9tYXhfdW5yb3RfbmZhY3RvcnMgPC0gZWZhX2FkdWx0X21heF91bnJvdF9laWdlbnZhbHVlcyAlPiUKICBmaWx0ZXIoU1MubG9hZGluZ3MgPiAxLCBQcm9wb3J0aW9uLkV4cGxhaW5lZCA+IDAuMDUpICU+JQogIGNvdW50KCkgJT4lCiAgYXMubnVtZXJpYygpCmVmYV9hZHVsdF9tYXhfdW5yb3RfbmZhY3RvcnMKCiMgbWFudWFsbHkgY2hlY2sgdGhhdCBlYWNoIGZhY3RvciBpcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBhdCBsZWFzdCBvbmUgbWVudGFsIGNhcGFjaXR5IGl0ZW0KZWZhX2FkdWx0X21heF91bnJvdF9sb2FkaW5ncyA8LSBmYS5zb3J0KGxvYWRpbmdzKGVmYV9hZHVsdF9tYXhfdW5yb3QpW10pICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICBzZWxlY3QoMTplZmFfYWR1bHRfbWF4X3Vucm90X25mYWN0b3JzKSAlPiUKICByZW5hbWUoRjEgPSBNUjEsIEYyID0gTVIyLCBGMyA9IE1SMywgRjQgPSBNUjQpICU+JSAjIGFkanVzdCBieSBoYW5kIGFzIG5lZWRlZAogIG11dGF0ZShGMV9hYnMgPSBhYnMoRjEpLAogICAgICAgICBGMl9hYnMgPSBhYnMoRjIpLAogICAgICAgICBGM19hYnMgPSBhYnMoRjMpLAogICAgICAgICBGNF9hYnMgPSBhYnMoRjQpLAogICAgICAgICBsb2FkaW5nX2FicyA9IHBtYXgoRjFfYWJzLCBGMl9hYnMsIEYzX2FicywgRjRfYWJzKSwKICAgICAgICAgbG9hZGluZyA9IGlmZWxzZShsb2FkaW5nX2FicyA9PSBhYnMoRjEpLCBGMSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobG9hZGluZ19hYnMgPT0gYWJzKEYyKSwgRjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nX2FicyA9PSBhYnMoRjMpLCBGMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nX2FicyA9PSBhYnMoRjQpLCBGNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSksCiAgICAgICAgIGZhY3RvciA9IGlmZWxzZShsb2FkaW5nID09IEYxLCAiRjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjIsICJGMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjMsICJGMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nID09IEY0LCAiRjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpLAogICAgICAgICBmYWN0b3JOYW1lID0gaWZlbHNlKGxvYWRpbmcgPT0gRjEsICJGYWN0b3IgMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjIsICJGYWN0b3IgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nID09IEYzLCAiRmFjdG9yIDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjQsICJGYWN0b3IgNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpKQoKZWZhX2FkdWx0X21heF91bnJvdF9sb2FkaW5ncyAlPiUgY291bnQoZmFjdG9yTmFtZSkgIyBkcm9wIGFueSBmYWN0b3JzIHdoZXJlIG4gPCAxCgojIHJlc2V0IGFzIG5lZWRlZAplZmFfYWR1bHRfbWF4X3Vucm90X25mYWN0b3JzIDwtIGVmYV9hZHVsdF9tYXhfdW5yb3RfbG9hZGluZ3MgJT4lIGNvdW50KGZhY3Rvck5hbWUpICU+JSBucm93KCkKYGBgCgojIyMgTWF4aW1hbCAoMTMtZmFjdG9yKSByb3RhdGVkIHNvbHV0aW9uCgpgYGB7ciBlZmEgYWR1bHRzIG1heGltYWwgcm90YXRlZH0KIyBkbyBmYWN0b3IgYW5hbHlzaXMKZWZhX2FkdWx0X21heF9yb3QgPC0gZmEoZDNfYWR1bHQsIG5mYWN0b3JzID0gMTMsIHJvdGF0ZSA9IHJvdF90eXBlLCBjb3IgPSBjb3JfdHlwZSkKZWZhX2FkdWx0X21heF9yb3QKCiMgZXhhbWluZSBlaWdlbnZhbHVlcyBhbmQgdmFyaWFuY2UgZXhwbGFpbmVkCmVmYV9hZHVsdF9tYXhfcm90X2VpZ2VudmFsdWVzIDwtIHByaW50KGVmYV9hZHVsdF9tYXhfcm90KSRWYWNjb3VudGVkICU+JQogIHQoKSAlPiUKICBkYXRhLmZyYW1lKCkKZWZhX2FkdWx0X21heF9yb3RfZWlnZW52YWx1ZXMKCiMgYnV0IHNlZSBodHRwczovL3d3dy5yZXNlYXJjaGdhdGUubmV0L3Bvc3QvSG93X3RvX2NhbGN1bGF0ZV90aGVfZXhwbGFpbmVkX3ZhcmlhbmNlX3Blcl9mYWN0b3JfaW5fYV9wcmluY2lwYWxfYXhpc19mYWN0b3JfYW5hbHlzaXMgaWYgcm90YXRpb24gIT0gInZhcmltYXgiCiMgdGFrZWF3YXk6IHVzZSAiUHJvcG9ydGlvbi5WYXIiIGluc3RlYWQgb2YgIlByb3BvcnRpb24uRXhwbGFpbmVkIgpgYGAKCiMjIyBTbWFsbCByb3RhdGVkIHNvbHV0aW9uCgpgYGB7ciBlZmEgYWR1bHRzIHNtYWxsIHJvdGF0ZWR9CiMgZG8gZmFjdG9yIGFuYWx5c2lzCmVmYV9hZHVsdF9zbWFsbF9yb3QgPC0gZmEoZDNfYWR1bHQsIG5mYWN0b3JzID0gZWZhX2FkdWx0X21heF91bnJvdF9uZmFjdG9ycywgcm90YXRlID0gcm90X3R5cGUsIGNvciA9IGNvcl90eXBlKQplZmFfYWR1bHRfc21hbGxfcm90CgojIGV4YW1pbmUgZWlnZW52YWx1ZXMgYW5kIHZhcmlhbmNlIGV4cGxhaW5lZAplZmFfYWR1bHRfc21hbGxfcm90X2VpZ2VudmFsdWVzIDwtIHByaW50KGVmYV9hZHVsdF9zbWFsbF9yb3QpJFZhY2NvdW50ZWQgJT4lCiAgdCgpICU+JQogIGRhdGEuZnJhbWUoKQplZmFfYWR1bHRfc21hbGxfcm90X2VpZ2VudmFsdWVzCgojIGJ1dCBzZWUgaHR0cHM6Ly93d3cucmVzZWFyY2hnYXRlLm5ldC9wb3N0L0hvd190b19jYWxjdWxhdGVfdGhlX2V4cGxhaW5lZF92YXJpYW5jZV9wZXJfZmFjdG9yX2luX2FfcHJpbmNpcGFsX2F4aXNfZmFjdG9yX2FuYWx5c2lzIGlmIHJvdGF0aW9uICE9ICJ2YXJpbWF4IgojIHRha2Vhd2F5OiB1c2UgIlByb3BvcnRpb24uVmFyIiBpbnN0ZWFkIG9mICJQcm9wb3J0aW9uLkV4cGxhaW5lZCIKYGBgCgojIyMjIExvYWRpbmdzCgpgYGB7ciBlZmEgYWR1bHRzIHNtYWxsIHJvdGF0ZWQgbG9hZGluZ3N9CiMgbWFrZSBkYXRhZnJhbWUgZm9yIGFsbCBmYWN0b3IgbG9hZGluZ3MgYW5kIGRvbWluYW50IGZhY3RvcgplZmFfYWR1bHRfc21hbGxfcm90X2xvYWRpbmdzIDwtIGVmYV9hZHVsdF9zbWFsbF9yb3QkbG9hZGluZ3NbXSAlPiUKICBmYS5zb3J0KCkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiY2FwYWNpdHkiKSAlPiUKICByZW5hbWUoRjEgPSBNUjEsIEYyID0gTVIyLCBGMyA9IE1SMykgJT4lICMgYWRqdXN0IGJ5IGhhbmQgYXMgbmVlZGVkCiAgbXV0YXRlKEYxX2FicyA9IGFicyhGMSksCiAgICAgICAgIEYyX2FicyA9IGFicyhGMiksCiAgICAgICAgIEYzX2FicyA9IGFicyhGMyksCiAgICAgICAgIGxvYWRpbmdfYWJzID0gcG1heChGMV9hYnMsIEYyX2FicywgRjNfYWJzKSwKICAgICAgICAgbG9hZGluZyA9IGlmZWxzZShsb2FkaW5nX2FicyA9PSBhYnMoRjEpLCBGMSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobG9hZGluZ19hYnMgPT0gYWJzKEYyKSwgRjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nX2FicyA9PSBhYnMoRjMpLCBGMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpLAogICAgICAgICBmYWN0b3IgPSBpZmVsc2UobG9hZGluZyA9PSBGMSwgIkYxIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nID09IEYyLCAiRjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nID09IEYzLCAiRjMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSwKICAgICAgICAgZmFjdG9yTmFtZSA9IGlmZWxzZShsb2FkaW5nID09IEYxLCAiRmFjdG9yIDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nID09IEYyLCAiRmFjdG9yIDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobG9hZGluZyA9PSBGMywgIkZhY3RvciAzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKSAlPiUKICBzZWxlY3QoY2FwYWNpdHksIEYxLCBGMiwgRjMsIGZhY3RvciwgZmFjdG9yTmFtZSwgbG9hZGluZywgbG9hZGluZ19hYnMpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZnVsbF9qb2luKGQgJT4lIHNlbGVjdChjYXBhY2l0eSwgY2FwV29yZGluZykpICU+JQogIG11dGF0ZShjYXBXb3JkaW5nID0gZ3N1YigiXFwgIiwgIl8iLCBnc3ViKCIgLS0uKiIsICIiLCBjYXBXb3JkaW5nKSkpICU+JQogIHNlbGVjdChjYXBhY2l0eSwgY2FwV29yZGluZywgRjE6bG9hZGluZ19hYnMpICU+JQogIGRpc3RpbmN0KCkKCiMgcHJpbnQgb3V0IGxpc3Qgb2YgaXRlbXMgYnkgZG9taW5hbnQgZmFjdG9yCmVmYV9hZHVsdF9zbWFsbF9yb3RfaXRlbXMgPC0gZWZhX2FkdWx0X3NtYWxsX3JvdF9sb2FkaW5ncyAlPiUKICBhcnJhbmdlKGZhY3RvciwgZGVzYyhsb2FkaW5nX2FicykpICU+JQogIG11dGF0ZShjYXBXb3JkaW5nUGx1cyA9IGlmZWxzZShsb2FkaW5nID4gMCwgY2FwV29yZGluZywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMChjYXBXb3JkaW5nLCAiIChuZWdhdGl2ZSBsb2FkaW5nKSIpKSkgJT4lCiAgZ3JvdXBfYnkoZmFjdG9yKSAlPiUKICBzdW1tYXJpc2UoaXRlbXMgPSBnc3ViKCJfIiwgIiAiLCBwYXN0ZShjYXBXb3JkaW5nUGx1cywgY29sbGFwc2UgPSAiLCAiKSkpCmhlYWQoZWZhX2FkdWx0X3NtYWxsX3JvdF9pdGVtcyRpdGVtcywgNDApCmBgYAoKIyBDaGlsZHJlbiBhbG9uZQoKIyMgRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzCgojIyMgTWF4aW1hbCAoMTMtZmFjdG9yKSB1bnJvdGF0ZWQgc29sdXRpb24KCmBgYHtyIGVmYSBjaGlsZHJlbiBtYXhpbWFsIHVucm90YXRlZH0KIyBkbyBmYWN0b3IgYW5hbHlzaXMKZWZhX2NoaWxkX21heF91bnJvdCA8LSBmYShkM19jaGlsZCwgbmZhY3RvcnMgPSAxMywgcm90YXRlID0gIm5vbmUiLCBjb3IgPSBjb3JfdHlwZSkKZWZhX2NoaWxkX21heF91bnJvdAoKIyBleGFtaW5lIGVpZ2VudmFsdWVzIGFuZCB2YXJpYW5jZSBleHBsYWluZWQKZWZhX2NoaWxkX21heF91bnJvdF9laWdlbnZhbHVlcyA8LSBwcmludChlZmFfY2hpbGRfbWF4X3Vucm90KSRWYWNjb3VudGVkICU+JQogIHQoKSAlPiUKICBkYXRhLmZyYW1lKCkKCiMgY291bnQgZmFjdG9ycyB3aXRoIGVpZ2VudmFsdWVzID4gMSBhbmQgdmFyaWFuY2UgZXhwbGFpbmVkID4gNSUKZWZhX2NoaWxkX21heF91bnJvdF9uZmFjdG9ycyA8LSBlZmFfY2hpbGRfbWF4X3Vucm90X2VpZ2VudmFsdWVzICU+JQogIGZpbHRlcihTUy5sb2FkaW5ncyA+IDEsIFByb3BvcnRpb24uRXhwbGFpbmVkID4gMC4wNSkgJT4lCiAgY291bnQoKSAlPiUKICBhcy5udW1lcmljKCkKZWZhX2NoaWxkX21heF91bnJvdF9uZmFjdG9ycwoKIyBtYW51YWxseSBjaGVjayB0aGF0IGVhY2ggZmFjdG9yIGlzIHRoZSBkb21pbmFudCBmYWN0b3IgZm9yIGF0IGxlYXN0IG9uZSBtZW50YWwgY2FwYWNpdHkgaXRlbQplZmFfY2hpbGRfbWF4X3Vucm90X2xvYWRpbmdzIDwtIGZhLnNvcnQobG9hZGluZ3MoZWZhX2NoaWxkX21heF91bnJvdClbXSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHNlbGVjdCgxOmVmYV9jaGlsZF9tYXhfdW5yb3RfbmZhY3RvcnMpICU+JQogIHJlbmFtZShGMSA9IE1SMSwgRjIgPSBNUjIsIEYzID0gTVIzKSAlPiUgIyBhZGp1c3QgYnkgaGFuZCBhcyBuZWVkZWQKICBtdXRhdGUoRjFfYWJzID0gYWJzKEYxKSwKICAgICAgICAgRjJfYWJzID0gYWJzKEYyKSwKICAgICAgICAgRjNfYWJzID0gYWJzKEYzKSwKICAgICAgICAgbG9hZGluZ19hYnMgPSBwbWF4KEYxX2FicywgRjJfYWJzLCBGM19hYnMpLAogICAgICAgICBsb2FkaW5nID0gaWZlbHNlKGxvYWRpbmdfYWJzID09IGFicyhGMSksIEYxLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nX2FicyA9PSBhYnMoRjIpLCBGMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmdfYWJzID09IGFicyhGMyksIEYzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSksCiAgICAgICAgIGZhY3RvciA9IGlmZWxzZShsb2FkaW5nID09IEYxLCAiRjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjIsICJGMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjMsICJGMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpLAogICAgICAgICBmYWN0b3JOYW1lID0gaWZlbHNlKGxvYWRpbmcgPT0gRjEsICJGYWN0b3IgMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjIsICJGYWN0b3IgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nID09IEYzLCAiRmFjdG9yIDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpCgplZmFfY2hpbGRfbWF4X3Vucm90X2xvYWRpbmdzICU+JSBjb3VudChmYWN0b3JOYW1lKSAjIGRyb3AgYW55IGZhY3RvcnMgd2hlcmUgbiA8IDEKCiMgcmVzZXQgYXMgbmVlZGVkCmVmYV9jaGlsZF9tYXhfdW5yb3RfbmZhY3RvcnMgPC0gZWZhX2NoaWxkX21heF91bnJvdF9sb2FkaW5ncyAlPiUgY291bnQoZmFjdG9yTmFtZSkgJT4lIG5yb3coKQpgYGAKCiMjIyBNYXhpbWFsICgxMy1mYWN0b3IpIHJvdGF0ZWQgc29sdXRpb24KCmBgYHtyIGVmYSBjaGlsZHJlbiBtYXhpbWFsIHJvdGF0ZWR9CiMgZG8gZmFjdG9yIGFuYWx5c2lzCmVmYV9jaGlsZF9tYXhfcm90IDwtIGZhKGQzX2NoaWxkLCBuZmFjdG9ycyA9IDEzLCByb3RhdGUgPSByb3RfdHlwZSwgY29yID0gY29yX3R5cGUpCmVmYV9jaGlsZF9tYXhfcm90CgojIGV4YW1pbmUgZWlnZW52YWx1ZXMgYW5kIHZhcmlhbmNlIGV4cGxhaW5lZAplZmFfY2hpbGRfbWF4X3JvdF9laWdlbnZhbHVlcyA8LSBwcmludChlZmFfY2hpbGRfbWF4X3JvdCkkVmFjY291bnRlZCAlPiUKICB0KCkgJT4lCiAgZGF0YS5mcmFtZSgpCmVmYV9jaGlsZF9tYXhfcm90X2VpZ2VudmFsdWVzCgojIGJ1dCBzZWUgaHR0cHM6Ly93d3cucmVzZWFyY2hnYXRlLm5ldC9wb3N0L0hvd190b19jYWxjdWxhdGVfdGhlX2V4cGxhaW5lZF92YXJpYW5jZV9wZXJfZmFjdG9yX2luX2FfcHJpbmNpcGFsX2F4aXNfZmFjdG9yX2FuYWx5c2lzIGlmIHJvdGF0aW9uICE9ICJ2YXJpbWF4IgojIHRha2Vhd2F5OiB1c2UgIlByb3BvcnRpb24uVmFyIiBpbnN0ZWFkIG9mICJQcm9wb3J0aW9uLkV4cGxhaW5lZCIKYGBgCgojIyMgU21hbGwgcm90YXRlZCBzb2x1dGlvbgoKYGBge3IgZWZhIGNoaWxkcmVuIHNtYWxsIHJvdGF0ZWR9CiMgZG8gZmFjdG9yIGFuYWx5c2lzCmVmYV9jaGlsZF9zbWFsbF9yb3QgPC0gZmEoZDNfY2hpbGQsIG5mYWN0b3JzID0gZWZhX2NoaWxkX21heF91bnJvdF9uZmFjdG9ycywgcm90YXRlID0gcm90X3R5cGUsIGNvciA9IGNvcl90eXBlKQplZmFfY2hpbGRfc21hbGxfcm90CgojIGV4YW1pbmUgZWlnZW52YWx1ZXMgYW5kIHZhcmlhbmNlIGV4cGxhaW5lZAplZmFfY2hpbGRfc21hbGxfcm90X2VpZ2VudmFsdWVzIDwtIHByaW50KGVmYV9jaGlsZF9zbWFsbF9yb3QpJFZhY2NvdW50ZWQgJT4lCiAgdCgpICU+JQogIGRhdGEuZnJhbWUoKQplZmFfY2hpbGRfc21hbGxfcm90X2VpZ2VudmFsdWVzCgojIGJ1dCBzZWUgaHR0cHM6Ly93d3cucmVzZWFyY2hnYXRlLm5ldC9wb3N0L0hvd190b19jYWxjdWxhdGVfdGhlX2V4cGxhaW5lZF92YXJpYW5jZV9wZXJfZmFjdG9yX2luX2FfcHJpbmNpcGFsX2F4aXNfZmFjdG9yX2FuYWx5c2lzIGlmIHJvdGF0aW9uICE9ICJ2YXJpbWF4IgojIHRha2Vhd2F5OiB1c2UgIlByb3BvcnRpb24uVmFyIiBpbnN0ZWFkIG9mICJQcm9wb3J0aW9uLkV4cGxhaW5lZCIKYGBgCgojIyMjIExvYWRpbmdzCgpgYGB7ciBlZmEgY2hpbGRyZW4gc21hbGwgcm90YXRlZCBsb2FkaW5nc30KIyBtYWtlIGRhdGFmcmFtZSBmb3IgYWxsIGZhY3RvciBsb2FkaW5ncyBhbmQgZG9taW5hbnQgZmFjdG9yCmVmYV9jaGlsZF9zbWFsbF9yb3RfbG9hZGluZ3MgPC0gZWZhX2NoaWxkX3NtYWxsX3JvdCRsb2FkaW5nc1tdICU+JQogIGZhLnNvcnQoKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjYXBhY2l0eSIpICU+JQogIHJlbmFtZShGMSA9IE1SMSwgRjIgPSBNUjIsIEYzID0gTVIzKSAlPiUgIyBhZGp1c3QgYnkgaGFuZCBhcyBuZWVkZWQKICBtdXRhdGUoRjFfYWJzID0gYWJzKEYxKSwKICAgICAgICAgRjJfYWJzID0gYWJzKEYyKSwKICAgICAgICAgRjNfYWJzID0gYWJzKEYzKSwKICAgICAgICAgbG9hZGluZ19hYnMgPSBwbWF4KEYxX2FicywgRjJfYWJzLCBGM19hYnMpLAogICAgICAgICBsb2FkaW5nID0gaWZlbHNlKGxvYWRpbmdfYWJzID09IGFicyhGMSksIEYxLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nX2FicyA9PSBhYnMoRjIpLCBGMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmdfYWJzID09IGFicyhGMyksIEYzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSksCiAgICAgICAgIGZhY3RvciA9IGlmZWxzZShsb2FkaW5nID09IEYxLCAiRjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjIsICJGMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjMsICJGMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpLAogICAgICAgICBmYWN0b3JOYW1lID0gaWZlbHNlKGxvYWRpbmcgPT0gRjEsICJGYWN0b3IgMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjIsICJGYWN0b3IgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nID09IEYzLCAiRmFjdG9yIDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpICU+JQogIHNlbGVjdChjYXBhY2l0eSwgRjEsIEYyLCBGMywgZmFjdG9yLCBmYWN0b3JOYW1lLCBsb2FkaW5nLCBsb2FkaW5nX2FicykgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBmdWxsX2pvaW4oZCAlPiUgc2VsZWN0KGNhcGFjaXR5LCBjYXBXb3JkaW5nKSkgJT4lCiAgbXV0YXRlKGNhcFdvcmRpbmcgPSBnc3ViKCJcXCAiLCAiXyIsIGdzdWIoIiAtLS4qIiwgIiIsIGNhcFdvcmRpbmcpKSkgJT4lCiAgc2VsZWN0KGNhcGFjaXR5LCBjYXBXb3JkaW5nLCBGMTpsb2FkaW5nX2FicykgJT4lCiAgZGlzdGluY3QoKQoKIyBwcmludCBvdXQgbGlzdCBvZiBpdGVtcyBieSBkb21pbmFudCBmYWN0b3IKZWZhX2NoaWxkX3NtYWxsX3JvdF9pdGVtcyA8LSBlZmFfY2hpbGRfc21hbGxfcm90X2xvYWRpbmdzICU+JQogIGFycmFuZ2UoZmFjdG9yLCBkZXNjKGxvYWRpbmdfYWJzKSkgJT4lCiAgbXV0YXRlKGNhcFdvcmRpbmdQbHVzID0gaWZlbHNlKGxvYWRpbmcgPiAwLCBjYXBXb3JkaW5nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKGNhcFdvcmRpbmcsICIgKG5lZ2F0aXZlIGxvYWRpbmcpIikpKSAlPiUKICBncm91cF9ieShmYWN0b3IpICU+JQogIHN1bW1hcmlzZShpdGVtcyA9IGdzdWIoIl8iLCAiICIsIHBhc3RlKGNhcFdvcmRpbmdQbHVzLCBjb2xsYXBzZSA9ICIsICIpKSkKaGVhZChlZmFfY2hpbGRfc21hbGxfcm90X2l0ZW1zJGl0ZW1zLCA0MCkKYGBgCgojIENvbWJpbmVkIGRhdGFzZXQ6IENoaWxkcmVuICYgYWR1bHRzCgojIyBFeHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMKCiMjIyBNYXhpbWFsICgxMy1mYWN0b3IpIHVucm90YXRlZCBzb2x1dGlvbgoKYGBge3IgZWZhIGNvbWJpbmVkIG1heGltYWwgdW5yb3RhdGVkfQojIGRvIGZhY3RvciBhbmFseXNpcwplZmFfY29tYl9tYXhfdW5yb3QgPC0gZmEoZDNfY29tYmluZWQsIG5mYWN0b3JzID0gMTMsIHJvdGF0ZSA9ICJub25lIiwgY29yID0gY29yX3R5cGUpCmVmYV9jb21iX21heF91bnJvdAoKIyBleGFtaW5lIGVpZ2VudmFsdWVzIGFuZCB2YXJpYW5jZSBleHBsYWluZWQKZWZhX2NvbWJfbWF4X3Vucm90X2VpZ2VudmFsdWVzIDwtIHByaW50KGVmYV9jb21iX21heF91bnJvdCkkVmFjY291bnRlZCAlPiUKICB0KCkgJT4lCiAgZGF0YS5mcmFtZSgpCgojIGNvdW50IGZhY3RvcnMgd2l0aCBlaWdlbnZhbHVlcyA+IDEgYW5kIHZhcmlhbmNlIGV4cGxhaW5lZCA+IDUlCmVmYV9jb21iX21heF91bnJvdF9uZmFjdG9ycyA8LSBlZmFfY29tYl9tYXhfdW5yb3RfZWlnZW52YWx1ZXMgJT4lCiAgZmlsdGVyKFNTLmxvYWRpbmdzID4gMSwgUHJvcG9ydGlvbi5FeHBsYWluZWQgPiAwLjA1KSAlPiUKICBjb3VudCgpICU+JQogIGFzLm51bWVyaWMoKQplZmFfY29tYl9tYXhfdW5yb3RfbmZhY3RvcnMKCiMgbWFudWFsbHkgY2hlY2sgdGhhdCBlYWNoIGZhY3RvciBpcyB0aGUgZG9taW5hbnQgZmFjdG9yIGZvciBhdCBsZWFzdCBvbmUgbWVudGFsIGNhcGFjaXR5IGl0ZW0KZWZhX2NvbWJfbWF4X3Vucm90X2xvYWRpbmdzIDwtIGZhLnNvcnQobG9hZGluZ3MoZWZhX2NvbWJfbWF4X3Vucm90KVtdKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgc2VsZWN0KDE6ZWZhX2NvbWJfbWF4X3Vucm90X25mYWN0b3JzKSAlPiUKICByZW5hbWUoRjEgPSBNUjEsIEYyID0gTVIyLCBGMyA9IE1SMykgJT4lICMgYWRqdXN0IGJ5IGhhbmQgYXMgbmVlZGVkCiAgbXV0YXRlKEYxX2FicyA9IGFicyhGMSksCiAgICAgICAgIEYyX2FicyA9IGFicyhGMiksCiAgICAgICAgIEYzX2FicyA9IGFicyhGMyksCiAgICAgICAgIGxvYWRpbmdfYWJzID0gcG1heChGMV9hYnMsIEYyX2FicywgRjNfYWJzKSwKICAgICAgICAgbG9hZGluZyA9IGlmZWxzZShsb2FkaW5nX2FicyA9PSBhYnMoRjEpLCBGMSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobG9hZGluZ19hYnMgPT0gYWJzKEYyKSwgRjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nX2FicyA9PSBhYnMoRjMpLCBGMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpLAogICAgICAgICBmYWN0b3IgPSBpZmVsc2UobG9hZGluZyA9PSBGMSwgIkYxIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nID09IEYyLCAiRjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nID09IEYzLCAiRjMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSwKICAgICAgICAgZmFjdG9yTmFtZSA9IGlmZWxzZShsb2FkaW5nID09IEYxLCAiRmFjdG9yIDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nID09IEYyLCAiRmFjdG9yIDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobG9hZGluZyA9PSBGMywgIkZhY3RvciAzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKQoKZWZhX2NvbWJfbWF4X3Vucm90X2xvYWRpbmdzICU+JSBjb3VudChmYWN0b3JOYW1lKSAjIGRyb3AgYW55IGZhY3RvcnMgd2hlcmUgbiA8IDEKYGBgCgojIyMgTWF4aW1hbCAoMTMtZmFjdG9yKSByb3RhdGVkIHNvbHV0aW9uCgpgYGB7ciBlZmEgY29tYmluZWQgbWF4aW1hbCByb3RhdGVkfQojIGRvIGZhY3RvciBhbmFseXNpcwplZmFfY29tYl9tYXhfcm90IDwtIGZhKGQzX2NvbWJpbmVkLCBuZmFjdG9ycyA9IDEzLCByb3RhdGUgPSByb3RfdHlwZSwgY29yID0gY29yX3R5cGUpCmVmYV9jb21iX21heF9yb3QKCiMgZXhhbWluZSBlaWdlbnZhbHVlcyBhbmQgdmFyaWFuY2UgZXhwbGFpbmVkCmVmYV9jb21iX21heF9yb3RfZWlnZW52YWx1ZXMgPC0gcHJpbnQoZWZhX2NvbWJfbWF4X3JvdCkkVmFjY291bnRlZCAlPiUKICB0KCkgJT4lCiAgZGF0YS5mcmFtZSgpCmVmYV9jb21iX21heF9yb3RfZWlnZW52YWx1ZXMKCiMgYnV0IHNlZSBodHRwczovL3d3dy5yZXNlYXJjaGdhdGUubmV0L3Bvc3QvSG93X3RvX2NhbGN1bGF0ZV90aGVfZXhwbGFpbmVkX3ZhcmlhbmNlX3Blcl9mYWN0b3JfaW5fYV9wcmluY2lwYWxfYXhpc19mYWN0b3JfYW5hbHlzaXMgaWYgcm90YXRpb24gIT0gInZhcmltYXgiCiMgdGFrZWF3YXk6IHVzZSAiUHJvcG9ydGlvbi5WYXIiIGluc3RlYWQgb2YgIlByb3BvcnRpb24uRXhwbGFpbmVkIgpgYGAKCiMjIyBTbWFsbCByb3RhdGVkIHNvbHV0aW9uCgpgYGB7ciBlZmEgY29tYmluZWQgc21hbGwgcm90YXRlZH0KIyBkbyBmYWN0b3IgYW5hbHlzaXMKZWZhX2NvbWJfc21hbGxfcm90IDwtIGZhKGQzX2NvbWJpbmVkLCBuZmFjdG9ycyA9IGVmYV9jb21iX21heF91bnJvdF9uZmFjdG9ycywgcm90YXRlID0gcm90X3R5cGUsIGNvciA9IGNvcl90eXBlKQplZmFfY29tYl9zbWFsbF9yb3QKCiMgZXhhbWluZSBlaWdlbnZhbHVlcyBhbmQgdmFyaWFuY2UgZXhwbGFpbmVkCmVmYV9jb21iX3NtYWxsX3JvdF9laWdlbnZhbHVlcyA8LSBwcmludChlZmFfY29tYl9zbWFsbF9yb3QpJFZhY2NvdW50ZWQgJT4lCiAgdCgpICU+JQogIGRhdGEuZnJhbWUoKQplZmFfY29tYl9zbWFsbF9yb3RfZWlnZW52YWx1ZXMKCiMgYnV0IHNlZSBodHRwczovL3d3dy5yZXNlYXJjaGdhdGUubmV0L3Bvc3QvSG93X3RvX2NhbGN1bGF0ZV90aGVfZXhwbGFpbmVkX3ZhcmlhbmNlX3Blcl9mYWN0b3JfaW5fYV9wcmluY2lwYWxfYXhpc19mYWN0b3JfYW5hbHlzaXMgaWYgcm90YXRpb24gIT0gInZhcmltYXgiCiMgdGFrZWF3YXk6IHVzZSAiUHJvcG9ydGlvbi5WYXIiIGluc3RlYWQgb2YgIlByb3BvcnRpb24uRXhwbGFpbmVkIgpgYGAKCiMjIyMgTG9hZGluZ3MKCmBgYHtyIGVmYSBjb21iaW5lZCBzbWFsbCByb3RhdGVkIGxvYWRpbmdzfQojIG1ha2UgZGF0YWZyYW1lIGZvciBhbGwgZmFjdG9yIGxvYWRpbmdzIGFuZCBkb21pbmFudCBmYWN0b3IKZWZhX2NvbWJfc21hbGxfcm90X2xvYWRpbmdzIDwtIGVmYV9jb21iX3NtYWxsX3JvdCRsb2FkaW5nc1tdICU+JQogIGZhLnNvcnQoKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJjYXBhY2l0eSIpICU+JQogIHJlbmFtZShGMSA9IE1SMSwgRjIgPSBNUjIsIEYzID0gTVIzKSAlPiUgIyBhZGp1c3QgYnkgaGFuZCBhcyBuZWVkZWQKICBtdXRhdGUoRjFfYWJzID0gYWJzKEYxKSwKICAgICAgICAgRjJfYWJzID0gYWJzKEYyKSwKICAgICAgICAgRjNfYWJzID0gYWJzKEYzKSwKICAgICAgICAgbG9hZGluZ19hYnMgPSBwbWF4KEYxX2FicywgRjJfYWJzLCBGM19hYnMpLAogICAgICAgICBsb2FkaW5nID0gaWZlbHNlKGxvYWRpbmdfYWJzID09IGFicyhGMSksIEYxLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nX2FicyA9PSBhYnMoRjIpLCBGMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmdfYWJzID09IGFicyhGMyksIEYzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSksCiAgICAgICAgIGZhY3RvciA9IGlmZWxzZShsb2FkaW5nID09IEYxLCAiRjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjIsICJGMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjMsICJGMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpLAogICAgICAgICBmYWN0b3JOYW1lID0gaWZlbHNlKGxvYWRpbmcgPT0gRjEsICJGYWN0b3IgMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGxvYWRpbmcgPT0gRjIsICJGYWN0b3IgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsb2FkaW5nID09IEYzLCAiRmFjdG9yIDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpICU+JQogIHNlbGVjdChjYXBhY2l0eSwgRjEsIEYyLCBGMywgZmFjdG9yLCBmYWN0b3JOYW1lLCBsb2FkaW5nLCBsb2FkaW5nX2FicykgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBmdWxsX2pvaW4oZCAlPiUgc2VsZWN0KGNhcGFjaXR5LCBjYXBXb3JkaW5nKSkgJT4lCiAgbXV0YXRlKGNhcFdvcmRpbmcgPSBnc3ViKCJcXCAiLCAiXyIsIGdzdWIoIiAtLS4qIiwgIiIsIGNhcFdvcmRpbmcpKSkgJT4lCiAgc2VsZWN0KGNhcGFjaXR5LCBjYXBXb3JkaW5nLCBGMTpsb2FkaW5nX2FicykgJT4lCiAgZGlzdGluY3QoKQoKIyBwcmludCBvdXQgbGlzdCBvZiBpdGVtcyBieSBkb21pbmFudCBmYWN0b3IKZWZhX2NvbWJfc21hbGxfcm90X2l0ZW1zIDwtIGVmYV9jb21iX3NtYWxsX3JvdF9sb2FkaW5ncyAlPiUKICBhcnJhbmdlKGZhY3RvciwgZGVzYyhsb2FkaW5nX2FicykpICU+JQogIG11dGF0ZShjYXBXb3JkaW5nUGx1cyA9IGlmZWxzZShsb2FkaW5nID4gMCwgY2FwV29yZGluZywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMChjYXBXb3JkaW5nLCAiIChuZWdhdGl2ZSBsb2FkaW5nKSIpKSkgJT4lCiAgZ3JvdXBfYnkoZmFjdG9yKSAlPiUKICBzdW1tYXJpc2UoaXRlbXMgPSBnc3ViKCJfIiwgIiAiLCBwYXN0ZShjYXBXb3JkaW5nUGx1cywgY29sbGFwc2UgPSAiLCAiKSkpCmhlYWQoZWZhX2NvbWJfc21hbGxfcm90X2l0ZW1zJGl0ZW1zLCA0MCkKYGBgCgojIFJlZ3Jlc3Npb24gb24gZmFjdG9yIHNjb3JlcwoKIyMgQ2hpbGRyZW4gdnMuIGFkdWx0cwoKYGBge3IgcmVncmVzc2lvbiBhZ2UgZ3JvdXAgZGF0YSBwcmVwfQpzY29yZXNfYWxsIDwtIGZhKGQzX2NvbWJpbmVkLCBuZmFjdG9ycyA9IGVmYV9jb21iX21heF91bnJvdF9uZmFjdG9ycywgcm90YXRlID0gcm90X3R5cGUsCiAgICAgICAgICAgICAgICAgY29yID0gY29yX3R5cGUsIHNjb3JlcyA9IHNjb3JlX3R5cGUpJHNjb3JlcyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJzdWJpZCIpICU+JQogIG11dGF0ZShhZ2VHcm91cCA9IGZhY3RvcihpZmVsc2UoZ3JlcGwoInJ1biIsIHN1YmlkKSwgImFkdWx0IiwgImNoaWxkIikpKQoKY29sbmFtZXMoc2NvcmVzX2FsbClbMjo0XSA8LSBjKCJzY29yZV9GMSIsICJzY29yZV9GMiIsICJzY29yZV9GMyIpCmBgYAoKYGBge3IgcmVncmVzc2lvbiBhZ2UgZ3JvdXAgYW5hbHlzaXN9CiMgYW5hbHl6ZQpzY29yZXNfYWxsX2FuYWx5c2lzIDwtIGQgJT4lCiAgc2VsZWN0KHN1YmlkLCBhZ2VHcm91cCwgY2hhcmFjdGVyKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGxlZnRfam9pbihzY29yZXNfYWxsKSAlPiUKICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlcikpICU+JQogIGZpbHRlcighaXMubmEoc2NvcmVfRjEpICYgIWlzLm5hKHNjb3JlX0YyKSAmICFpcy5uYShzY29yZV9GMyksICFpcy5uYShhZ2VHcm91cCkpICU+JQogIGdhdGhlcihmYWN0b3IsIHNjb3JlLCBzdGFydHNfd2l0aCgic2NvcmVfIikpICU+JQogIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZmFjdG9yKSkKCiMgc2V0IGNvbnRyYXN0cwpjb250cmFzdHMoc2NvcmVzX2FsbF9hbmFseXNpcyRmYWN0b3IpIDwtIGNiaW5kKEYxID0gYygxLCAtMSwgMCksICMgTUFLRSBTVVJFIFRPIERPVUJMRS1DSEVDSyEhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjMgPSBjKDAsIC0xLCAxKSkKY29udHJhc3RzKHNjb3Jlc19hbGxfYW5hbHlzaXMkY2hhcmFjdGVyKSA8LSBjYmluZChyb2JvdCA9IGMoLTEsIDEpKQpjb250cmFzdHMoc2NvcmVzX2FsbF9hbmFseXNpcyRhZ2VHcm91cCkgPC0gY2JpbmQoY2hpbGQgPSBjKC0xLCAxKSkKCnIxIDwtIGxtZXIoc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKyAoMSB8IHN1YmlkKSwgc2NvcmVzX2FsbF9hbmFseXNpcykKcjIgPC0gbG1lcihzY29yZSB+IGNoYXJhY3RlciAqIGZhY3RvciArIGFnZUdyb3VwICsgKDEgfCBzdWJpZCksIHNjb3Jlc19hbGxfYW5hbHlzaXMpCnIzIDwtIGxtZXIoc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKiBhZ2VHcm91cCArICgxIHwgc3ViaWQpLCBzY29yZXNfYWxsX2FuYWx5c2lzKQphbm92YShyMSwgcjIsIHIzKQojIHN1bW1hcnkocjEpCiMgc3VtbWFyeShyMikKc3VtbWFyeShyMykKCnJvdW5kKHNpZ25pZihzdW1tYXJ5KHIzKSRjb2VmZmljaWVudHMsIDMpLCAyKSAlPiUgZGF0YS5mcmFtZSgpICMgJT4lIFZpZXcoKQoKIyBzdGVwd2lzZSByZWdyZXNzaW9uCmRyb3AxKHIzLCB0ZXN0ID0gIkNoaXNxIikKcjNfc3RlcDIgPC0gbG1lcihzY29yZSB+IGNoYXJhY3RlciAqIGZhY3RvciArIGFnZUdyb3VwICsgY2hhcmFjdGVyOmFnZUdyb3VwICsgZmFjdG9yOmFnZUdyb3VwICsgKDEgfCBzdWJpZCksIHNjb3Jlc19hbGxfYW5hbHlzaXMpCmRyb3AxKHIzX3N0ZXAyLCB0ZXN0ID0gIkNoaXNxIikKcjNfc3RlcDMgPC0gbG1lcihzY29yZSB+IGNoYXJhY3RlciAqIGZhY3RvciArIGFnZUdyb3VwICsgZmFjdG9yOmFnZUdyb3VwICsgKDEgfCBzdWJpZCksIHNjb3Jlc19hbGxfYW5hbHlzaXMpCmRyb3AxKHIzX3N0ZXAzLCB0ZXN0ID0gIkNoaXNxIikKCiMgIyByb2JvdCBvbmx5CiMgcm9ib3RfcjEgPC0gbG1lcihzY29yZSB+IGZhY3RvciArICgxIHwgc3ViaWQpLCBzY29yZXNfYWxsX2FuYWx5c2lzICU+JSBmaWx0ZXIoY2hhcmFjdGVyID09ICJyb2JvdCIpKQojIHJvYm90X3IyIDwtIGxtZXIoc2NvcmUgfiBmYWN0b3IgKyBhZ2VHcm91cCArICgxIHwgc3ViaWQpLCBzY29yZXNfYWxsX2FuYWx5c2lzICU+JSBmaWx0ZXIoY2hhcmFjdGVyID09ICJyb2JvdCIpKQojIHJvYm90X3IzIDwtIGxtZXIoc2NvcmUgfiBmYWN0b3IgKiBhZ2VHcm91cCArICgxIHwgc3ViaWQpLCBzY29yZXNfYWxsX2FuYWx5c2lzICU+JSBmaWx0ZXIoY2hhcmFjdGVyID09ICJyb2JvdCIpKQojIGFub3ZhKHJvYm90X3IxLCByb2JvdF9yMiwgcm9ib3RfcjMpCiMgIyBzdW1tYXJ5KHJvYm90X3IxKQojICMgc3VtbWFyeShyb2JvdF9yMikKIyBzdW1tYXJ5KHJvYm90X3IzKQpgYGAKCmBgYHtyIHJlZ3Jlc3Npb24gYWdlIGdyb3VwIHBsb3R9CnNjb3Jlc19hbGxfcGxvdHRpbmcgPC0gZCAlPiUKICBzZWxlY3Qoc3ViaWQsIGFnZUdyb3VwLCBjaGFyYWN0ZXIpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZnVsbF9qb2luKHNjb3Jlc19hbGwpICU+JQogIG11dGF0ZShjaGFyYWN0ZXIgPSBmYWN0b3IoY2hhcmFjdGVyKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShzY29yZV9GMSksICFpcy5uYShzY29yZV9GMiksICFpcy5uYShzY29yZV9GMyksICFpcy5uYShhZ2VHcm91cCkpICU+JQogIGdhdGhlcihmYWN0b3IsIHNjb3JlLCBzdGFydHNfd2l0aCgic2NvcmVfIikpICU+JQogIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZmFjdG9yKSkgJT4lCiAgbXVsdGlfYm9vdChjb2x1bW4gPSAic2NvcmUiLAogICAgICAgICAgICAgc3VtbWFyeV9ncm91cHMgPSBjKCJhZ2VHcm91cCIsICJjaGFyYWN0ZXIiLCAiZmFjdG9yIiksCiAgICAgICAgICAgICBzdGF0aXN0aWNzX2Z1bmN0aW9ucyA9IGMoIm1lYW4iLCAiY2lfbG93ZXIiLCAiY2lfdXBwZXIiKSkKCiMgcGxvdApnZ3Bsb3Qoc2NvcmVzX2FsbF9wbG90dGluZyAlPiUKICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJTb2NpYWwtZW1vdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaHlzaW9sb2dpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJjZXB0dWFsLWNvZ25pdGl2ZSIpKSwKICAgICAgICAgICAgICAgIGFnZUdyb3VwID0gZmFjdG9yKGFnZUdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiY2hpbGQiLCAiYWR1bHQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNoaWxkcmVuIiwgImFkdWx0cyIpKSksCiAgICAgICBhZXMoeCA9IGFnZUdyb3VwLCB5ID0gbWVhbiwgY29sb3IgPSBjaGFyYWN0ZXIsIHNoYXBlID0gY2hhcmFjdGVyKSkgKwogIGZhY2V0X3dyYXAoImZhY3RvciIsIG5jb2wgPSAzKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgZ2VvbV9wb2ludChzaXplID0gNSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNCkpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksIAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjQpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTksIDE1KSkgKwogIGxhYnModGl0bGUgPSAiRmFjdG9yIHNjb3JlcyBieSBhZ2UgZ3JvdXAiLAogICAgICAgIyBzdWJ0aXRsZSA9ICJBZHVsdHMgKFN0dWR5IDEpIHZzLiBjaGlsZHJlbiAoU3R1ZHkgMilcbiIsCiAgICAgICB4ID0gIkFnZSBncm91cCIsCiAgICAgICB5ID0gIk1lYW4gZmFjdG9yIHNjb3JlIikgIyAxMDAwIGJ5IDUwMApgYGAKCiMjIENoaWxkcmVuIGJ5IGFnZSBhdCB0ZXN0CgpgYGB7ciByZWdyZXNzaW9uIGFnZSBhdCB0ZXN0IGRhdGEgcHJlcH0Kc2NvcmVzX2NoaWxkcmVuIDwtIGZhKGQzX2NoaWxkLCBuZmFjdG9ycyA9IGVmYV9jb21iX21heF91bnJvdF9uZmFjdG9ycywgcm90YXRlID0gcm90X3R5cGUsCiAgICAgICAgICAgICAgICAgY29yID0gY29yX3R5cGUsIHNjb3JlcyA9IHNjb3JlX3R5cGUpJHNjb3JlcyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJzdWJpZCIpICU+JQogIG11dGF0ZShhZ2VHcm91cCA9IGZhY3RvcihpZmVsc2UoZ3JlcGwoInJ1biIsIHN1YmlkKSwgImFkdWx0IiwgImNoaWxkIikpKQoKY29sbmFtZXMoc2NvcmVzX2NoaWxkcmVuKVsyOjRdIDwtIGMoInNjb3JlX0YxIiwgInNjb3JlX0YyIiwgInNjb3JlX0YzIikKYGBgCgpgYGB7ciByZWdyZXNzaW9uIGFnZSBhdCB0ZXN0IGFuYWx5c2lzfQojIGFuYWx5emUKc2NvcmVzX2NoaWxkcmVuX2FuYWx5c2lzIDwtIGQgJT4lCiAgc2VsZWN0KHN1YmlkLCBhZ2UsIGNoYXJhY3RlcikgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBsZWZ0X2pvaW4oc2NvcmVzX2NoaWxkcmVuKSAlPiUKICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlcikpICU+JQogIGZpbHRlcighaXMubmEoc2NvcmVfRjEpICYgIWlzLm5hKHNjb3JlX0YyKSAmICFpcy5uYShzY29yZV9GMyksICFpcy5uYShhZ2VHcm91cCkpICU+JQogIGdhdGhlcihmYWN0b3IsIHNjb3JlLCBzdGFydHNfd2l0aCgic2NvcmVfIikpICU+JQogIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZmFjdG9yKSkKCiMgc2V0IGNvbnRyYXN0cwpjb250cmFzdHMoc2NvcmVzX2NoaWxkcmVuX2FuYWx5c2lzJGZhY3RvcikgPC0gY2JpbmQoRjEgPSBjKDEsIC0xLCAwKSwgIyBNQUtFIFNVUkUgVE8gRE9VQkxFLUNIRUNLISEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMyA9IGMoMCwgLTEsIDEpKQpjb250cmFzdHMoc2NvcmVzX2NoaWxkcmVuX2FuYWx5c2lzJGNoYXJhY3RlcikgPC0gY2JpbmQocm9ib3QgPSBjKC0xLCAxKSkKCnI0IDwtIGxtZXIoc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKyAoMSB8IHN1YmlkKSwgc2NvcmVzX2NoaWxkcmVuX2FuYWx5c2lzKQpyNSA8LSBsbWVyKHNjb3JlIH4gY2hhcmFjdGVyICogZmFjdG9yICsgc2NhbGUoYWdlKSArICgxIHwgc3ViaWQpLCBzY29yZXNfY2hpbGRyZW5fYW5hbHlzaXMpCnI2IDwtIGxtZXIoc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKiBzY2FsZShhZ2UpICsgKDEgfCBzdWJpZCksIHNjb3Jlc19jaGlsZHJlbl9hbmFseXNpcykKYW5vdmEocjQsIHI1LCByNikKIyBzdW1tYXJ5KHI0KQojIHN1bW1hcnkocjUpCnN1bW1hcnkocjYpCgojIHN0ZXB3aXNlIHJlZ3Jlc3Npb24KZHJvcDEocjYsIHRlc3QgPSAiQ2hpc3EiKQpyNl9zdGVwMiA8LSBsbWVyKHNjb3JlIH4gY2hhcmFjdGVyICogZmFjdG9yICsgc2NhbGUoYWdlKSArIGNoYXJhY3RlcjpzY2FsZShhZ2UpICsgZmFjdG9yOnNjYWxlKGFnZSkgKyAoMSB8IHN1YmlkKSwgc2NvcmVzX2NoaWxkcmVuX2FuYWx5c2lzKQpkcm9wMShyNl9zdGVwMiwgdGVzdCA9ICJDaGlzcSIpCnN1bW1hcnkocjZfc3RlcDIpCgojIGV4cGxvcmUgcG9seW5vaWFsIGVmZmVjdHMgb2YgYWdlCnI2YiA8LSBsbWVyKHNjb3JlIH4gY2hhcmFjdGVyICogZmFjdG9yICogcG9seShhZ2UsIDEpICsgKDEgfCBzdWJpZCksIHNjb3Jlc19jaGlsZHJlbl9hbmFseXNpcykKcjcgPC0gbG1lcihzY29yZSB+IGNoYXJhY3RlciAqIGZhY3RvciAqIHBvbHkoYWdlLCAyKSArICgxIHwgc3ViaWQpLCBzY29yZXNfY2hpbGRyZW5fYW5hbHlzaXMpCnI4IDwtIGxtZXIoc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKiBwb2x5KGFnZSwgMykgKyAoMSB8IHN1YmlkKSwgc2NvcmVzX2NoaWxkcmVuX2FuYWx5c2lzKQphbm92YShyNmIsIHI3LCByOCkKIyBzdW1tYXJ5KHI2YikKIyBzdW1tYXJ5KHI3KQpzdW1tYXJ5KHI4KQoKcm91bmQoc2lnbmlmKHN1bW1hcnkocjYpJGNvZWZmaWNpZW50cywgMyksIDIpICU+JSBkYXRhLmZyYW1lKCkgIyAlPiUgVmlldygpCgojIHN0ZXB3aXNlIHJlZ3Jlc3Npb24KZHJvcDEocjgsIHRlc3QgPSAiQ2hpc3EiKQpyOF9zdGVwMiA8LSBsbWVyKHNjb3JlIH4gY2hhcmFjdGVyICogZmFjdG9yICogcG9seShhZ2UsIDIpICsgcG9seShhZ2UsIDMpICsgcG9seShhZ2UsIDMpOmNoYXJhY3RlciArIHBvbHkoYWdlLCAzKTpmYWN0b3IgKyAoMSB8IHN1YmlkKSwgc2NvcmVzX2NoaWxkcmVuX2FuYWx5c2lzKQpkcm9wMShyOF9zdGVwMiwgdGVzdCA9ICJDaGlzcSIpCnI4X3N0ZXAzIDwtIGxtZXIoc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKyBwb2x5KGFnZSwgMykgKyAoMSB8IHN1YmlkKSArIHBvbHkoYWdlLCAyKSArIGNoYXJhY3Rlcjpwb2x5KGFnZSwgMikgKyBmYWN0b3I6cG9seShhZ2UsIDIpLCBzY29yZXNfY2hpbGRyZW5fYW5hbHlzaXMpCmRyb3AxKHI4X3N0ZXAzLCB0ZXN0ID0gIkNoaXNxIikKc3VtbWFyeShyOF9zdGVwMykKCiMgIyByb2JvdCBvbmx5CiMgcm9ib3RfcjQgPC0gbG1lcihzY29yZSB+IGZhY3RvciArICgxIHwgc3ViaWQpLCBzY29yZXNfY2hpbGRyZW5fYW5hbHlzaXMgJT4lIGZpbHRlcihjaGFyYWN0ZXIgPT0gInJvYm90IikpCiMgcm9ib3RfcjUgPC0gbG1lcihzY29yZSB+IGZhY3RvciArIHNjYWxlKGFnZSkgKyAoMSB8IHN1YmlkKSwgc2NvcmVzX2NoaWxkcmVuX2FuYWx5c2lzICU+JSBmaWx0ZXIoY2hhcmFjdGVyID09ICJyb2JvdCIpKQojIHJvYm90X3I2IDwtIGxtZXIoc2NvcmUgfiBmYWN0b3IgKiBzY2FsZShhZ2UpICsgKDEgfCBzdWJpZCksIHNjb3Jlc19jaGlsZHJlbl9hbmFseXNpcyAlPiUgZmlsdGVyKGNoYXJhY3RlciA9PSAicm9ib3QiKSkKIyBhbm92YShyb2JvdF9yNCwgcm9ib3RfcjUsIHJvYm90X3I2KQojICMgc3VtbWFyeShyb2JvdF9yNCkKIyAjIHN1bW1hcnkocm9ib3RfcjUpCiMgc3VtbWFyeShyb2JvdF9yNikKYGBgCgpgYGB7ciByZWdyZXNzaW9uIGFnZSBhdCB0ZXN0IHBsb3R9CnNjb3Jlc19jaGlsZHJlbl9wbG90dGluZyA8LSBkICU+JQogIHNlbGVjdChzdWJpZCwgYWdlLCBjaGFyYWN0ZXIpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZnVsbF9qb2luKHNjb3Jlc19jaGlsZHJlbikgJT4lCiAgbXV0YXRlKGNoYXJhY3RlciA9IGZhY3RvcihjaGFyYWN0ZXIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHNjb3JlX0YxKSwgIWlzLm5hKHNjb3JlX0YyKSwgIWlzLm5hKHNjb3JlX0YzKSwgIWlzLm5hKGFnZSkpICU+JQogIGdhdGhlcihmYWN0b3IsIHNjb3JlLCBzdGFydHNfd2l0aCgic2NvcmVfIikpICU+JQogIG11dGF0ZShmYWN0b3IgPSBmYWN0b3IoZmFjdG9yKSkgJT4lCiAgbXVsdGlfYm9vdChjb2x1bW4gPSAic2NvcmUiLAogICAgICAgICAgICAgc3VtbWFyeV9ncm91cHMgPSBjKCJhZ2UiLCAiY2hhcmFjdGVyIiwgImZhY3RvciIpLAogICAgICAgICAgICAgc3RhdGlzdGljc19mdW5jdGlvbnMgPSBjKCJtZWFuIiwgImNpX2xvd2VyIiwgImNpX3VwcGVyIikpCgojIHBsb3QKZ2dwbG90KHNjb3Jlc19jaGlsZHJlbl9wbG90dGluZyAlPiUKICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJTb2NpYWwtZW1vdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaHlzaW9sb2dpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJjZXB0dWFsLWNvZ25pdGl2ZSIpKSksCiAgICAgICBhZXMoeCA9IGFnZSwgeSA9IG1lYW4sIGNvbG9yID0gY2hhcmFjdGVyLCBmaWxsID0gY2hhcmFjdGVyLCBzaGFwZSA9IGNoYXJhY3RlcikpICsKICBmYWNldF93cmFwKCJmYWN0b3IiLCBuY29sID0gMykgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgYWxwaGEgPSAwLjQpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBhbHBoYSA9IDAuNCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxOSwgMTUpKSArCiAgbGFicyh0aXRsZSA9ICJGYWN0b3Igc2NvcmVzIGJ5IGNoaWxkcmVuJ3MgYWdlIiwKICAgICAgICMgc3VidGl0bGUgPSAiQ2hpbGRyZW4gKFN0dWR5IDIpXG4iLAogICAgICAgeCA9ICJBZ2UgKHllYXJzKSIsCiAgICAgICB5ID0gIkZhY3RvciBzY29yZSIpICMgMTAwMCBieSA1MDAKYGBgCgojIyBBZHVsdHMgYnkgYWdlIGF0IHRlc3QKCmBgYHtyIHJlZ3Jlc3Npb24gYWR1bHQgYWdlIGF0IHRlc3QgZGF0YSBwcmVwfQpzY29yZXNfYWR1bHRzIDwtIGZhKGQzX2FkdWx0LCBuZmFjdG9ycyA9IGVmYV9jb21iX21heF91bnJvdF9uZmFjdG9ycywgcm90YXRlID0gcm90X3R5cGUsCiAgICAgICAgICAgICAgICAgY29yID0gY29yX3R5cGUsIHNjb3JlcyA9IHNjb3JlX3R5cGUpJHNjb3JlcyAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJzdWJpZCIpICU+JQogIG11dGF0ZShhZ2VHcm91cCA9IGZhY3RvcihpZmVsc2UoZ3JlcGwoInJ1biIsIHN1YmlkKSwgImFkdWx0IiwgImFkdWx0IikpKQoKY29sbmFtZXMoc2NvcmVzX2FkdWx0cylbMjo0XSA8LSBjKCJzY29yZV9GMSIsICJzY29yZV9GMiIsICJzY29yZV9GMyIpCmBgYAoKYGBge3IgcmVncmVzc2lvbiBhZHVsdCBhZ2UgYXQgdGVzdCBhbmFseXNpc30KIyBhbmFseXplCnNjb3Jlc19hZHVsdHNfYW5hbHlzaXMgPC0gZCAlPiUKICBzZWxlY3Qoc3ViaWQsIGFnZSwgY2hhcmFjdGVyKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGxlZnRfam9pbihzY29yZXNfYWR1bHRzKSAlPiUKICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlcikpICU+JQogIGZpbHRlcighaXMubmEoc2NvcmVfRjEpICYgIWlzLm5hKHNjb3JlX0YyKSAmICFpcy5uYShzY29yZV9GMyksICFpcy5uYShhZ2UpKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgc3RhcnRzX3dpdGgoInNjb3JlXyIpKSAlPiUKICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvcikpCgojIHNldCBjb250cmFzdHMKY29udHJhc3RzKHNjb3Jlc19hZHVsdHNfYW5hbHlzaXMkZmFjdG9yKSA8LSBjYmluZChGMSA9IGMoMSwgLTEsIDApLCAjIE1BS0UgU1VSRSBUTyBET1VCTEUtQ0hFQ0shIQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYzID0gYygwLCAtMSwgMSkpCmNvbnRyYXN0cyhzY29yZXNfYWR1bHRzX2FuYWx5c2lzJGNoYXJhY3RlcikgPC0gY2JpbmQocm9ib3QgPSBjKC0xLCAxKSkKCnI0IDwtIGxtZXIoc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKyAoMSB8IHN1YmlkKSwgc2NvcmVzX2FkdWx0c19hbmFseXNpcykKcjUgPC0gbG1lcihzY29yZSB+IGNoYXJhY3RlciAqIGZhY3RvciArIHNjYWxlKGFnZSkgKyAoMSB8IHN1YmlkKSwgc2NvcmVzX2FkdWx0c19hbmFseXNpcykKcjYgPC0gbG1lcihzY29yZSB+IGNoYXJhY3RlciAqIGZhY3RvciAqIHNjYWxlKGFnZSkgKyAoMSB8IHN1YmlkKSwgc2NvcmVzX2FkdWx0c19hbmFseXNpcykKYW5vdmEocjQsIHI1LCByNikKIyBzdW1tYXJ5KHI0KQojIHN1bW1hcnkocjUpCnN1bW1hcnkocjYpCgojIHN0ZXB3aXNlIHJlZ3Jlc3Npb24KZHJvcDEocjYsIHRlc3QgPSAiQ2hpc3EiKQpyNl9zdGVwMiA8LSBsbWVyKHNjb3JlIH4gY2hhcmFjdGVyICogZmFjdG9yICsgc2NhbGUoYWdlKSArIGNoYXJhY3RlcjpzY2FsZShhZ2UpICsgZmFjdG9yOnNjYWxlKGFnZSkgKyAoMSB8IHN1YmlkKSwgc2NvcmVzX2FkdWx0c19hbmFseXNpcykKZHJvcDEocjZfc3RlcDIsIHRlc3QgPSAiQ2hpc3EiKQpzdW1tYXJ5KHI2X3N0ZXAyKQoKIyBleHBsb3JlIHBvbHlub2lhbCBlZmZlY3RzIG9mIGFnZQpyNmIgPC0gbG1lcihzY29yZSB+IGNoYXJhY3RlciAqIGZhY3RvciAqIHBvbHkoYWdlLCAxKSArICgxIHwgc3ViaWQpLCBzY29yZXNfYWR1bHRzX2FuYWx5c2lzKQpyNyA8LSBsbWVyKHNjb3JlIH4gY2hhcmFjdGVyICogZmFjdG9yICogcG9seShhZ2UsIDIpICsgKDEgfCBzdWJpZCksIHNjb3Jlc19hZHVsdHNfYW5hbHlzaXMpCnI4IDwtIGxtZXIoc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKiBwb2x5KGFnZSwgMykgKyAoMSB8IHN1YmlkKSwgc2NvcmVzX2FkdWx0c19hbmFseXNpcykKYW5vdmEocjZiLCByNywgcjgpCiMgc3VtbWFyeShyNmIpCnN1bW1hcnkocjcpCnN1bW1hcnkocjgpCgpyb3VuZChzaWduaWYoc3VtbWFyeShyNikkY29lZmZpY2llbnRzLCAzKSwgMikgJT4lIGRhdGEuZnJhbWUoKSAjICU+JSBWaWV3KCkKCiMgc3RlcHdpc2UgcmVncmVzc2lvbgpkcm9wMShyOCwgdGVzdCA9ICJDaGlzcSIpCnI4X3N0ZXAyIDwtIGxtZXIoc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKiBwb2x5KGFnZSwgMikgKyBwb2x5KGFnZSwgMykgKyBwb2x5KGFnZSwgMyk6Y2hhcmFjdGVyICsgcG9seShhZ2UsIDMpOmZhY3RvciArICgxIHwgc3ViaWQpLCBzY29yZXNfYWR1bHRzX2FuYWx5c2lzKQpkcm9wMShyOF9zdGVwMiwgdGVzdCA9ICJDaGlzcSIpCnI4X3N0ZXAzIDwtIGxtZXIoc2NvcmUgfiBjaGFyYWN0ZXIgKiBmYWN0b3IgKyBwb2x5KGFnZSwgMykgKyAoMSB8IHN1YmlkKSArIHBvbHkoYWdlLCAyKSArIGNoYXJhY3Rlcjpwb2x5KGFnZSwgMikgKyBmYWN0b3I6cG9seShhZ2UsIDIpLCBzY29yZXNfYWR1bHRzX2FuYWx5c2lzKQpkcm9wMShyOF9zdGVwMywgdGVzdCA9ICJDaGlzcSIpCnN1bW1hcnkocjhfc3RlcDMpCmBgYAoKYGBge3IgcmVncmVzc2lvbiBhZHVsdCBhZ2UgYXQgdGVzdCBwbG90fQpzY29yZXNfYWR1bHRzX3Bsb3R0aW5nIDwtIGQgJT4lCiAgZmlsdGVyKCFpcy5uYShhZ2UpKSAlPiUKICBzZWxlY3Qoc3ViaWQsIGFnZSwgY2hhcmFjdGVyKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGZ1bGxfam9pbihzY29yZXNfYWR1bHRzKSAlPiUKICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlcikpICU+JQogIGZpbHRlcighaXMubmEoc2NvcmVfRjEpLCAhaXMubmEoc2NvcmVfRjIpLCAhaXMubmEoc2NvcmVfRjMpLCAhaXMubmEoYWdlKSkgJT4lCiAgZ2F0aGVyKGZhY3Rvciwgc2NvcmUsIHN0YXJ0c193aXRoKCJzY29yZV8iKSkgJT4lCiAgbXV0YXRlKGZhY3RvciA9IGZhY3RvcihmYWN0b3IpKSAlPiUKICBtdWx0aV9ib290KGNvbHVtbiA9ICJzY29yZSIsCiAgICAgICAgICAgICBzdW1tYXJ5X2dyb3VwcyA9IGMoImFnZSIsICJjaGFyYWN0ZXIiLCAiZmFjdG9yIiksCiAgICAgICAgICAgICBzdGF0aXN0aWNzX2Z1bmN0aW9ucyA9IGMoIm1lYW4iLCAiY2lfbG93ZXIiLCAiY2lfdXBwZXIiKSkKCiMgcGxvdApnZ3Bsb3Qoc2NvcmVzX2FkdWx0c19wbG90dGluZyAlPiUKICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICBtdXRhdGUoZmFjdG9yID0gZmFjdG9yKGZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJTb2NpYWwtZW1vdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaHlzaW9sb2dpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJjZXB0dWFsLWNvZ25pdGl2ZSIpKSksCiAgICAgICBhZXMoeCA9IGFnZSwgeSA9IG1lYW4sIGNvbG9yID0gY2hhcmFjdGVyLCBmaWxsID0gY2hhcmFjdGVyLCBzaGFwZSA9IGNoYXJhY3RlcikpICsKICBmYWNldF93cmFwKCJmYWN0b3IiLCBuY29sID0gMykgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgYWxwaGEgPSAwLjQpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBhbHBoYSA9IDAuNCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxOSwgMTUpKSArCiAgbGFicyh0aXRsZSA9ICJGYWN0b3Igc2NvcmVzIGJ5IGFkdWx0cydzIGFnZSIsCiAgICAgICAjIHN1YnRpdGxlID0gIkFkdWx0cyAoU3R1ZHkgMilcbiIsCiAgICAgICB4ID0gIkFnZSAoeWVhcnMpIiwKICAgICAgIHkgPSAiRmFjdG9yIHNjb3JlIikgIyAxMDAwIGJ5IDUwMApgYGAKCiMjIEJpZyBmaWd1cmUKCmBgYHtyIGJpZyBmaWd1cmV9CiMgYnkgY29uZGl0aW9uCmQxX2J5Y29uZDIgPC0gZDIgJT4lCiAgbGVmdF9qb2luKGRfY2hpbGQwMiAlPiUgc2VsZWN0KHN1YmlkLCBhZ2UpKSAlPiUKICBzZWxlY3QoY2hhcmFjdGVyLCBjYXBhY2l0eSwgY2FwV29yZGluZywgcmVzcG9uc2VOdW0sIHN1YmlkLCBhZ2VHcm91cCwgYWdlKSAlPiUKICBmaWx0ZXIoY2FwYWNpdHkgIT0gIm5hIiwgaXMubmEocmVzcG9uc2VOdW0pID09IEYpICU+JQogIG11dGF0ZShjYXBXb3JkaW5nID0gZ3N1YigiIC0tLioiLCAiIiwgY2FwV29yZGluZyksCiAgICAgICAgIGFnZUdyb3VwMyA9IGlmZWxzZShhZ2VHcm91cCA9PSAiYWR1bHQiLCAiYWR1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGlzLm5hKGFnZSksIE5BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhZ2UgPCA4LCAiN3kiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFnZSA8IDksICI4eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYWdlIDwgMTAsICI5eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpKSkgJT4lCiAgZGlzdGluY3QoKQoKZDFfYnljb25kMiAlPiUgc2VsZWN0KGFnZUdyb3VwMywgc3ViaWQpICU+JSBkaXN0aW5jdCgpICU+JSBjb3VudChhZ2VHcm91cDMpCgojIG1ha2UgZGYgZm9yIHBsb3R0aW5nCmQxX2J5Y29uZDJfbWIgPC0gbXVsdGlfYm9vdChkMV9ieWNvbmQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAicmVzcG9uc2VOdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5X2dyb3VwcyA9IGMoImFnZUdyb3VwMyIsICJjaGFyYWN0ZXIiLCAiY2FwYWNpdHkiLCAiY2FwV29yZGluZyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWNzX2Z1bmN0aW9ucyA9IGMoIm1lYW4iLCAiY2lfbG93ZXIiLCAiY2lfdXBwZXIiKSkKCmQxX2J5Y29uZDJfbWJfZmFjdG9yc0FsbCA8LSBkMV9ieWNvbmQyX21iICU+JSAKICBmdWxsX2pvaW4oZWZhX2NvbWJfc21hbGxfcm90X2xvYWRpbmdzICU+JQogICAgICAgICAgICAgIGdyb3VwX2J5KGZhY3RvcikgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKG9yZGVyID0gcmFuayhkZXNjKGxvYWRpbmdfYWJzKSkpKSAlPiUKICBhcnJhbmdlKGNoYXJhY3RlciwgZmFjdG9yLCBkZXNjKGxvYWRpbmdfYWJzKSkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJmdWxsX29yZGVyIikgJT4lCiAgbXV0YXRlKGZ1bGxfb3JkZXIgPSBhcy5udW1lcmljKGZ1bGxfb3JkZXIpKSAlPiUKICBhcnJhbmdlKGZhY3Rvck5hbWUsIGZ1bGxfb3JkZXIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZUdyb3VwMykpICU+JQogIG11dGF0ZShmYWN0b3JOYW1lID0gZmFjdG9yKGZhY3Rvck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiRmFjdG9yIDEiLCAiRmFjdG9yIDIiLCAiRmFjdG9yIDMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJTb2NpYWwtZW1vdGlvbmFsIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGh5c2lvbG9naWNhbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcmNlcHR1YWwtY29nbml0aXZlIikpKQoKZG9kZ2Vfd2lkdGggPC0gMgoKZ2dwbG90KGQxX2J5Y29uZDJfbWJfZmFjdG9yc0FsbCwgCiAgICAgICBhZXMoeCA9IGRlc2Mob3JkZXIqMiksIHkgPSBtZWFuLAogICAgICAgICAgIGNvbG9yID0gYWdlR3JvdXAzLCBzaGFwZSA9IGFnZUdyb3VwMywKICAgICAgICAgICBsYWJlbCA9IGNhcFdvcmRpbmcpKSArCiAgZmFjZXRfZ3JpZChmYWN0b3JOYW1lIH4gY2hhcmFjdGVyLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbHR5ID0gMykgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMykgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDEsIGx0eSA9IDMpICsKICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gZG9kZ2Vfd2lkdGgpLCBzaXplID0gOCkgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKHJlcCgxOCwgMyksIDE3KSkgKwogICMgc2NhbGVfY29sb3VyX2JyZXdlcih0eXBlID0gInNlcSIsIHBhbGV0dGUgPSAiUHVSZCIpICsKICBzY2FsZV9jb2xvdXJfaHVlKGggPSBjKDAsIDE4MCkpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gZG9kZ2Vfd2lkdGgpLCB3aWR0aCA9IDApICsKICBnZW9tX3RleHQoYWVzKHkgPSAtMC41LCBoanVzdCA9IDApLCAKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAjIGNvbG9yID0gZDFfYnljb25kMl9tYl9mYWN0b3JzQWxsJHRleHRDb2xvciwKICAgICAgICAgICAgc2l6ZSA9IDgpICsKICBsYWJzKHRpdGxlID0gIlJlc3BvbnNlcyBieSBtZW50YWwgY2FwYWNpdHkgaXRlbSIsCiAgICAgICB5ID0gIk1lYW4gcmVzcG9uc2UgKDAgPSBOTywgMC41ID0gS0lOREEsIDEgPSBZRVMpIiwKICAgICAgIHggPSAiQ2FwYWNpdHkiLAogICAgICAgY29sb3IgPSAiQWdlIGdyb3VwOiAiLCBzaGFwZSA9ICJBZ2UgZ3JvdXA6ICIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCAwLjUsIDEpKSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZV9idygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiAgICAgICAgIyBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAjIDE3MDAgYnkgMjAwMAoKYGBgCgpgYGB7ciB0YWJsZXMgYW5kIGNoaXNxIHRlc3RzIGZvciBpdGVtc30KIyBGSUxURVJFRCBCWSBST0JPVAoKIyBmZWVsIHNhZmUKd2l0aChkMiAlPiUgZmlsdGVyKGNhcFdvcmRpbmcgPT0gImZlZWxfc2FmZSIsIAogICAgICAgICAgICAgICAgICAgIWlzLm5hKHJlc3BvbnNlQ2F0KSwKICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9PSAicm9ib3QiKSwKICAgICB0YWJsZShhZ2VHcm91cCwgcmVzcG9uc2VDYXQpKSAjJT4lCiAgI3N1bW1hcnkoKQoKIyBmZWVsIHRpcmVkCndpdGgoZDIgJT4lIGZpbHRlcihjYXBXb3JkaW5nID09ICJmZWVsX3RpcmVkIiwgCiAgICAgICAgICAgICAgICAgICAhaXMubmEocmVzcG9uc2VDYXQpLAogICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID09ICJyb2JvdCIpLAogICAgIHRhYmxlKGFnZUdyb3VwLCByZXNwb25zZUNhdCkpICMlPiUKICAjc3VtbWFyeSgpCgojIGZlZWwgc2NhcmVkCndpdGgoZDIgJT4lIGZpbHRlcihjYXBXb3JkaW5nID09ICJmZWVsX3NjYXJlZCIsIAogICAgICAgICAgICAgICAgICAgIWlzLm5hKHJlc3BvbnNlQ2F0KSwKICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9PSAicm9ib3QiKSwKICAgICB0YWJsZShhZ2VHcm91cCwgcmVzcG9uc2VDYXQpKSAjJT4lCiAgI3N1bW1hcnkoKQoKIyBnZXQgaHVuZ3J5CndpdGgoZDIgJT4lIGZpbHRlcihjYXBXb3JkaW5nID09ICJnZXRfaHVuZ3J5IiwgCiAgICAgICAgICAgICAgICAgICAhaXMubmEocmVzcG9uc2VDYXQpLAogICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID09ICJyb2JvdCIpLAogICAgIHRhYmxlKGFnZUdyb3VwLCByZXNwb25zZUNhdCkpICMlPiUKICAjc3VtbWFyeSgpCgojIGZlZWwgcGFpbgp3aXRoKGQyICU+JSBmaWx0ZXIoY2FwV29yZGluZyA9PSAiZmVlbF9wYWluIiwgCiAgICAgICAgICAgICAgICAgICAhaXMubmEocmVzcG9uc2VDYXQpLAogICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID09ICJyb2JvdCIpLAogICAgIHRhYmxlKGFnZUdyb3VwLCByZXNwb25zZUNhdCkpICMlPiUKICAjc3VtbWFyeSgpCgojIGZlZWwgcHJvdWQKcHJvdWRfdGFibGUgPC0gd2l0aChkMiAlPiUgZmlsdGVyKGNhcFdvcmRpbmcgPT0gImZlZWxfcHJvdWQiLCAKICAgICAgICAgICAgICAgICAgICFpcy5uYShyZXNwb25zZUNhdCksCiAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPT0gInJvYm90IikgJT4lCiAgICAgICBtdXRhdGUoYWdlR3JvdXAzID0gaWZlbHNlKGFnZUdyb3VwID09ICJhZHVsdCIsICJhZHVsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShpcy5uYShhZ2UpLCBOQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhZ2UgPCA4LCAiNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFnZSA8IDksICI4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjkiKSkpKSksCiAgICAgdGFibGUoYWdlR3JvdXAzLCByZXNwb25zZUNhdCkpICU+JQogIHByb3AudGFibGUoMSkgCnByb3VkX3RhYmxlCnByb3VkX3RhYmxlWzMsMl0rcHJvdWRfdGFibGVbMywzXQoKIyBmZWVsIGhhcHB5CmhhcHB5X3RhYmxlIDwtIHdpdGgoZDIgJT4lIGZpbHRlcihjYXBXb3JkaW5nID09ICJmZWVsX2hhcHB5IiwgCiAgICAgICAgICAgICAgICAgICAhaXMubmEocmVzcG9uc2VDYXQpLAogICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID09ICJyb2JvdCIpICU+JQogICAgICAgbXV0YXRlKGFnZUdyb3VwMyA9IGlmZWxzZShhZ2VHcm91cCA9PSAiYWR1bHQiLCAiYWR1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoaXMubmEoYWdlKSwgTkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYWdlIDwgOCwgIjciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhZ2UgPCA5LCAiOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI5IikpKSkpLAogICAgIHRhYmxlKGFnZUdyb3VwMywgcmVzcG9uc2VDYXQpKSAlPiUKICBwcm9wLnRhYmxlKDEpIApoYXBweV90YWJsZQpoYXBweV90YWJsZVszLDJdK2hhcHB5X3RhYmxlWzMsM10KCiMgZmVlbCBndWlsdHkKZ3VpbHR5X3RhYmxlIDwtIHdpdGgoZDIgJT4lIGZpbHRlcihjYXBXb3JkaW5nID09ICJmZWVsX2d1aWx0eSIsIAogICAgICAgICAgICAgICAgICAgIWlzLm5hKHJlc3BvbnNlQ2F0KSwKICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9PSAicm9ib3QiKSAlPiUKICAgICAgIG11dGF0ZShhZ2VHcm91cDMgPSBpZmVsc2UoYWdlR3JvdXAgPT0gImFkdWx0IiwgImFkdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGlzLm5hKGFnZSksIE5BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFnZSA8IDgsICI3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYWdlIDwgOSwgIjgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOSIpKSkpKSwKICAgICB0YWJsZShhZ2VHcm91cDMsIHJlc3BvbnNlQ2F0KSkgJT4lCiAgcHJvcC50YWJsZSgxKSAKZ3VpbHR5X3RhYmxlCmd1aWx0eV90YWJsZVsxLDJdK2d1aWx0eV90YWJsZVsxLDNdCmd1aWx0eV90YWJsZVsyLDJdK2d1aWx0eV90YWJsZVsyLDNdCmd1aWx0eV90YWJsZVszLDJdK2d1aWx0eV90YWJsZVszLDNdCgpjbG1fZ3VpbHR5IDwtIG9yZGluYWw6OmNsbShyZXNwb25zZUNhdCB+IGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGQyICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY2FwV29yZGluZyA9PSAiZmVlbF9ndWlsdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEocmVzcG9uc2VDYXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPT0gInJvYm90IikpCnN1bW1hcnkoY2xtX2d1aWx0eSkKCiMgcGVyc29uYWxpdHkKcGVyc29uYWxpdHlfdGFibGUgPC0gd2l0aChkMiAlPiUgZmlsdGVyKGNhcFdvcmRpbmcgPT0gImhhdmVfYV9wZXJzb25hbGl0eSIsIAogICAgICAgICAgICAgICAgICAgIWlzLm5hKHJlc3BvbnNlQ2F0KSwKICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9PSAicm9ib3QiKSAlPiUKICAgICAgIG11dGF0ZShhZ2VHcm91cDMgPSBpZmVsc2UoYWdlR3JvdXAgPT0gImFkdWx0IiwgImFkdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGlzLm5hKGFnZSksIE5BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFnZSA8IDgsICI3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYWdlIDwgOSwgIjgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOSIpKSkpKSwKICAgICB0YWJsZShhZ2VHcm91cDMsIHJlc3BvbnNlQ2F0KSkgJT4lCiAgcHJvcC50YWJsZSgxKSAKcGVyc29uYWxpdHlfdGFibGUKcGVyc29uYWxpdHlfdGFibGVbMywyXStwZXJzb25hbGl0eV90YWJsZVszLDNdCgojIHNlbGYtY29udHJvbApzZWxmX2NvbnRyb2xfdGFibGUgPC0gd2l0aChkMiAlPiUgZmlsdGVyKGNhcFdvcmRpbmcgPT0gImhhdmVfc2VsZi1jb250cm9sIiwgCiAgICAgICAgICAgICAgICAgICAhaXMubmEocmVzcG9uc2VDYXQpLAogICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID09ICJyb2JvdCIpICU+JQogICAgICAgbXV0YXRlKGFnZUdyb3VwMyA9IGlmZWxzZShhZ2VHcm91cCA9PSAiYWR1bHQiLCAiYWR1bHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoaXMubmEoYWdlKSwgTkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYWdlIDwgOCwgIjciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhZ2UgPCA5LCAiOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI5IikpKSkpLAogICAgIHRhYmxlKGFnZUdyb3VwMywgcmVzcG9uc2VDYXQpKSAlPiUKICBwcm9wLnRhYmxlKDEpIApzZWxmX2NvbnRyb2xfdGFibGUKc2VsZl9jb250cm9sX3RhYmxlWzEsMl0rc2VsZl9jb250cm9sX3RhYmxlWzEsM10Kc2VsZl9jb250cm9sX3RhYmxlWzIsMl0rc2VsZl9jb250cm9sX3RhYmxlWzIsM10Kc2VsZl9jb250cm9sX3RhYmxlWzMsMl0rc2VsZl9jb250cm9sX3RhYmxlWzMsM10KCmNsbV9zZWxmX2NvbnRyb2wgPC0gb3JkaW5hbDo6Y2xtKHJlc3BvbnNlQ2F0IH4gYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZDIgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihjYXBXb3JkaW5nID09ICJoYXZlX3NlbGYtY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpcy5uYShyZXNwb25zZUNhdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9PSAicm9ib3QiKSkKc3VtbWFyeShjbG1fc2VsZl9jb250cm9sKQoKIyBNT1JFIEdFTkVSQUwKCmF0X2xlYXN0X2tpbmRhXzl5IDwtIGQyICU+JSAKICBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlQ2F0KSwKICAgICAgICAgYWdlR3JvdXAgPT0gImNoaWxkIiwKICAgICAgICAgIWlzLm5hKGFnZSksCiAgICAgICAgIGFnZSA+IDkpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgY291bnQoY2hhcmFjdGVyLCBjYXBhY2l0eSwgcmVzcG9uc2VDYXQpICU+JQogIGdyb3VwX2J5KGNoYXJhY3RlciwgY2FwYWNpdHkpICU+JQogIG11dGF0ZShwcm9wX24gPSBuL3N1bShuLCBuYS5ybSA9IFQpKSAlPiUKICBzZWxlY3QoLW4pICU+JQogIHNwcmVhZChyZXNwb25zZUNhdCwgcHJvcF9uKSAlPiUgIyBuKSAlPiUKICBtdXRhdGUoYXRfbGVhc3Rfa2luZGEgPSBzdW0oa2luZGEsIHllcykpICU+JQogIGxlZnRfam9pbihlZmFfY29tYl9zbWFsbF9yb3RfbG9hZGluZ3MpICU+JQogIGFycmFuZ2UoZmFjdG9yLCBkZXNjKGF0X2xlYXN0X2tpbmRhKSkKCmF0X2xlYXN0X2tpbmRhXzl5ICU+JQogIHNlbGVjdChjaGFyYWN0ZXI6YXRfbGVhc3Rfa2luZGEsIGZhY3RvciwgbG9hZGluZykKCmF0X2xlYXN0X2tpbmRhX2FkdWx0IDwtIGQyICU+JSAKICBmaWx0ZXIoIWlzLm5hKHJlc3BvbnNlQ2F0KSwKICAgICAgICAgY2hhcmFjdGVyID09ICJyb2JvdCIsCiAgICAgICAgIGFnZUdyb3VwID09ICJhZHVsdCIpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgY291bnQoY2FwYWNpdHksIHJlc3BvbnNlQ2F0KSAlPiUKICBncm91cF9ieShjYXBhY2l0eSkgJT4lCiAgbXV0YXRlKHByb3BfbiA9IG4vc3VtKG4sIG5hLnJtID0gVCkpICU+JQogIHNlbGVjdCgtbikgJT4lCiAgc3ByZWFkKHJlc3BvbnNlQ2F0LCBwcm9wX24pICU+JSAjIG4pICU+JQogIG11dGF0ZShhdF9sZWFzdF9raW5kYSA9IHN1bShraW5kYSwgeWVzKSkgJT4lCiAgbGVmdF9qb2luKGVmYV9jb21iX3NtYWxsX3JvdF9sb2FkaW5ncykgJT4lCiAgYXJyYW5nZShmYWN0b3IsIGRlc2MoYXRfbGVhc3Rfa2luZGEpKQoKYXRfbGVhc3Rfa2luZGFfYWR1bHQgJT4lCiAgc2VsZWN0KGNhcGFjaXR5OmF0X2xlYXN0X2tpbmRhLCBmYWN0b3IsIGxvYWRpbmcpCgpgYGAKCiMjIEJJRyBUQUJMRQoKYGBge3IgYmlnIHRhYmxlfQojIG1ha2UgZGF0YWZyYW1lCmJpZ190YWJsZSA8LSBlZmFfYWR1bHRfc21hbGxfcm90X2xvYWRpbmdzICU+JSAKICBzZXROYW1lcyhwYXN0ZTAoJ2FkdWx0XycsIG5hbWVzKC4pKSkgJT4lIAogIHJlbmFtZShjYXBhY2l0eSA9IGFkdWx0X2NhcGFjaXR5LCAKICAgICAgICAgY2FwV29yZGluZyA9IGFkdWx0X2NhcFdvcmRpbmcpICU+JQogIGZ1bGxfam9pbihlZmFfY2hpbGRfc21hbGxfcm90X2xvYWRpbmdzICU+JQogICAgICAgICAgICAgIHNldE5hbWVzKHBhc3RlMCgnY2hpbGRfJywgbmFtZXMoLikpKSAlPiUKICAgICAgICAgICAgICByZW5hbWUoY2FwYWNpdHkgPSBjaGlsZF9jYXBhY2l0eSwKICAgICAgICAgICAgICAgICAgICAgY2FwV29yZGluZyA9IGNoaWxkX2NhcFdvcmRpbmcpKSAlPiUKICBmdWxsX2pvaW4oZWZhX2NvbWJfc21hbGxfcm90X2xvYWRpbmdzICU+JQogICAgICAgICAgICAgIHNldE5hbWVzKHBhc3RlMCgnY29tYl8nLCBuYW1lcyguKSkpICU+JQogICAgICAgICAgICAgIHJlbmFtZShjYXBhY2l0eSA9IGNvbWJfY2FwYWNpdHksIAogICAgICAgICAgICAgICAgICAgICBjYXBXb3JkaW5nID0gY29tYl9jYXBXb3JkaW5nKSkgJT4lCiAgYXJyYW5nZShjb21iX2ZhY3RvciwgZGVzYyhjb21iX2xvYWRpbmdfYWJzKSkgJT4lCiAgbXV0YXRlKGNhcFdvcmRpbmcgPSBnc3ViKCJfIiwgIiAiLCBjYXBXb3JkaW5nKSkgJT4lCiAgc2VsZWN0KGNhcFdvcmRpbmcsIAogICAgICAgICBhZHVsdF9GMiwgY2hpbGRfRjEsIGNvbWJfRjEsICMgZG91YmxlLWNoZWNrIGFkdWx0cyEKICAgICAgICAgYWR1bHRfRjEsIGNoaWxkX0YyLCBjb21iX0YyLCAjIGRvdWJsZS1jaGVjayBhZHVsdHMhCiAgICAgICAgIGFkdWx0X0YzLCBjaGlsZF9GMywgY29tYl9GMykgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJjYXBXb3JkaW5nIikgJT4lCiAgc2lnbmlmKDMpICU+JQogIHJvdW5kKDIpCgpiaWdfdGFibGUKYGBgCgpgYGB7ciByZWxhdGlvbnNoaXBzIGJldHdlZW4gc2NvcmVzfQpjb3IucGxvdChzY29yZXNfYWxsICU+JSBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInN1YmlkIikgJT4lIHNlbGVjdCgtYWdlR3JvdXApKQpjb3IudGVzdChzY29yZXNfYWxsJHNjb3JlX0YxLCBzY29yZXNfYWxsJHNjb3JlX0YyLCB1c2UgPSAiY29tcGxldGUub2JzIikKY29yLnRlc3Qoc2NvcmVzX2FsbCRzY29yZV9GMSwgc2NvcmVzX2FsbCRzY29yZV9GMywgdXNlID0gImNvbXBsZXRlLm9icyIpCmNvci50ZXN0KHNjb3Jlc19hbGwkc2NvcmVfRjIsIHNjb3Jlc19hbGwkc2NvcmVfRjMsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQoKCmNvci5jaShzY29yZXNfYWR1bHRzICU+JSBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInN1YmlkIikgJT4lIHNlbGVjdCgtYWdlR3JvdXApKQpjb3IuY2koc2NvcmVzX2NoaWxkcmVuICU+JSBjb2x1bW5fdG9fcm93bmFtZXModmFyID0gInN1YmlkIikgJT4lIHNlbGVjdCgtYWdlR3JvdXApKQpjb3IuY2koc2NvcmVzX2FsbCAlPiUgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJzdWJpZCIpICU+JSBzZWxlY3QoLWFnZUdyb3VwKSkKYGBgCgpgYGB7ciBuZXcgcGxvdH0KIyBieSBjb25kaXRpb24KZDFfYnljb25kMyA8LSBkMiAlPiUKICBsZWZ0X2pvaW4oZF9jaGlsZDAyICU+JSBzZWxlY3Qoc3ViaWQsIGFnZSkpICU+JQogIHNlbGVjdChjaGFyYWN0ZXIsIGNhcGFjaXR5LCBjYXBXb3JkaW5nLCByZXNwb25zZUNhdCwgc3ViaWQsIGFnZUdyb3VwLCBhZ2UpICU+JQogIGZpbHRlcihjYXBhY2l0eSAhPSAibmEiLCAhaXMubmEocmVzcG9uc2VDYXQpKSAlPiUKICBtdXRhdGUoY2FwV29yZGluZyA9IGdzdWIoIiAtLS4qIiwgIiIsIGNhcFdvcmRpbmcpLAogICAgICAgICBhZ2VHcm91cDMgPSBpZmVsc2UoYWdlR3JvdXAgPT0gImFkdWx0IiwgImFkdWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShpcy5uYShhZ2UpLCBOQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYWdlIDwgOCwgIjd5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhZ2UgPCA5LCAiOHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGFnZSA8IDEwLCAiOXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKSkpICU+JQogIGRpc3RpbmN0KCkKCmQxX2J5Y29uZDMgJT4lIHNlbGVjdChhZ2VHcm91cDMsIHN1YmlkKSAlPiUgZGlzdGluY3QoKSAlPiUgY291bnQoYWdlR3JvdXAzKQoKIyBtYWtlIGRmIGZvciBwbG90dGluZwpkMV9ieWNvbmQzX21iX2ZhY3RvcnNBbGwgPC0gZDFfYnljb25kMyAlPiUgCiAgZnVsbF9qb2luKGVmYV9jb21iX3NtYWxsX3JvdF9sb2FkaW5ncyAlPiUKICAgICAgICAgICAgICBncm91cF9ieShmYWN0b3IpICU+JQogICAgICAgICAgICAgIG11dGF0ZShvcmRlciA9IHJhbmsoZGVzYyhsb2FkaW5nX2FicykpKSkgJT4lCiAgYXJyYW5nZShjaGFyYWN0ZXIsIGZhY3RvciwgZGVzYyhsb2FkaW5nX2FicykpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiZnVsbF9vcmRlciIpICU+JQogIG11dGF0ZShmdWxsX29yZGVyID0gYXMubnVtZXJpYyhmdWxsX29yZGVyKSkgJT4lCiAgYXJyYW5nZShmYWN0b3JOYW1lLCBmdWxsX29yZGVyKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZmlsdGVyKCFpcy5uYShhZ2VHcm91cDMpKSAlPiUKICBtdXRhdGUoZmFjdG9yTmFtZSA9IGZhY3RvcihmYWN0b3JOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkZhY3RvciAxIiwgIkZhY3RvciAyIiwgIkZhY3RvciAzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiU29jaWFsLWVtb3Rpb25hbCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBoeXNpb2xvZ2ljYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJjZXB0dWFsLWNvZ25pdGl2ZSIpKSwKICAgICAgICAgYWdlbnRpYyA9IGlmZWxzZShjYXBXb3JkaW5nICVpbiUgYygiZGVjaWRlX3doYXRfdG9fZG8iLCAibWFrZV9jaG9pY2VzIiwgImhhdmVfc2VsZl9jb250cm9sIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ha2VfcGxhbnMiLCAiaGF2ZV9nb2FscyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmRlcnN0YW5kX2hvd19zb21lYm9keV9lbHNlX2lzX2ZlZWxpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrbm93X3doYXQnc19uaWNlX2FuZF93aGF0J3NfbWVhbiIsICJoYXZlX3Rob3VnaHRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtZW1iZXJfdGhpbmdzIiwgImNvbW11bmljYXRlX3dpdGhfc29tZWJvZHlfZWxzZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsIEZBTFNFKSkKCgpkMV9ieWNvbmQzX2Fubm90YXRlIDwtIGQxX2J5Y29uZDNfbWJfZmFjdG9yc0FsbCAlPiUgCiAgZmlsdGVyKG9yZGVyIDw9IDQpICU+JSAKICBzZWxlY3QoY2hhcmFjdGVyLCBvcmRlciwgY2FwV29yZGluZykgJT4lIAogIGRpc3RpbmN0KCkKCiMgZ2dwbG90KGQxX2J5Y29uZDNfbWJfZmFjdG9yc0FsbCAlPiUgZmlsdGVyKG9yZGVyIDw9IDQpLCAKIyAgICAgICAgYWVzKHggPSBpbnRlcmFjdGlvbihhZ2VHcm91cDMsIGRlc2Mob3JkZXIqMikpLCAKIyAgICAgICAgICAgICMgeSA9IHJlc3BvbnNlQ2F0LAojICAgICAgICAgICAgIyBjb2xvciA9IGFnZUdyb3VwMywgc2hhcGUgPSBhZ2VHcm91cDMsCiMgICAgICAgICAgICBmaWxsID0gcmVzcG9uc2VDYXQsCiMgICAgICAgICAgICBsYWJlbCA9IGFnZUdyb3VwMykpICsKIyAgICAgICAgICAgICMgbGFiZWwgPSBnc3ViKCJfIiwgIiAiLCBwYXN0ZShjYXBXb3JkaW5nLCBhZ2VHcm91cDMsIHNlcCA9ICI6ICIpKSkpICsKIyAgICMgZmFjZXRfZ3JpZChmYWN0b3JOYW1lIH4gY2hhcmFjdGVyICogb3JkZXIsIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKIyAgIGZhY2V0X2dyaWQoZmFjdG9yTmFtZSB+IGNoYXJhY3Rlciwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwojICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsKIyAgIGdlb21fdGV4dChhZXMoeSA9IC0wLjUsIGhqdXN0ID0gMCksIAojICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwKIyAgICAgICAgICAgICAjIGNvbG9yID0gZDFfYnljb25kMl9tYl9mYWN0b3JzQWxsJHRleHRDb2xvciwKIyAgICAgICAgICAgICBzaXplID0gOCkgKwojICAgZ2VvbV90ZXh0KGFlcyh4ID0gb3JkZXIsIHkgPSAxLjUsIGxhYmVsID0gY2FwV29yZGluZyksIGhqdXN0ID0gLTEpICsKIyAgICMgYW5ub3RhdGUoInRleHQiLCBhZXMoZmFjZXQgPSBvcmRlciwgbGFiZWwgPSBkMV9ieWNvbmQzX2Fubm90YXRlJGNhcFdvcmRpbmcpKSArCiMgICBsYWJzKHRpdGxlID0gIlJlc3BvbnNlcyBieSBtZW50YWwgY2FwYWNpdHkgaXRlbSIsCiMgICAgICAgIHkgPSAiUmVsYXRpdmUgZnJlcXVlbmN5IiwKIyAgICAgICAgeCA9ICJDYXBhY2l0eSAqIEFnZSBncm91cCIsCiMgICAgICAgIGZpbGwgPSAiUmVzcG9uc2U6ICIpICsKIyAgIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsIDAuNSwgMSkpICsKIyAgICMgY29vcmRfZmxpcCgpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAojICAgICAgICAgIyBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAjIDE3MDAgYnkgMjAwMAoKZ2dwbG90KGQxX2J5Y29uZDNfbWJfZmFjdG9yc0FsbCAlPiUgCiAgICAgICAgIGZpbHRlcihvcmRlciA8PSA1KSAlPiUKICAgICAgICAgbXV0YXRlKGZhY2V0ID0gdG9vbHM6OnRvVGl0bGVDYXNlKHBhc3RlMChjaGFyYWN0ZXIsICIgKCIsIGFnZUdyb3VwLCAiKSIpKSksIAogICAgICAgICAjIG11dGF0ZShmYWNldCA9IHRvb2xzOjp0b1RpdGxlQ2FzZShwYXN0ZShhZ2VHcm91cCwgY2hhcmFjdGVyLCBzZXAgPSAiOiAiKSkpLCAKICAgICAgIGFlcyh4ID0gZGVzYyhvcmRlcioyKSwgCiAgICAgICAgICAgZmlsbCA9IGNoYXJhY3RlciwKICAgICAgICAgICBhbHBoYSA9IHJlc3BvbnNlQ2F0LAogICAgICAgICAgICMgZmlsbCA9IHJlc3BvbnNlQ2F0LAogICAgICAgICAgIGxhYmVsID0gZ3N1YigiXyIsICIgIiwgY2FwV29yZGluZykpKSArCiAgZmFjZXRfZ3JpZChmYWN0b3JOYW1lIH4gZmFjZXQpICsgIywgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gInN0YWNrIiwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcz1jKDAuNCwgMC43LCAxKSkgKwogIGdlb21fdGV4dChhZXMoeSA9IDUsIGhqdXN0ID0gMCksIAogICAgICAgICAgICBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICMgY29sb3IgPSBkMV9ieWNvbmQyX21iX2ZhY3RvcnNBbGwkdGV4dENvbG9yLAogICAgICAgICAgICBzaXplID0gOCkgKwogIGxhYnModGl0bGUgPSAiUmVzcG9uc2VzIGJ5IG1lbnRhbCBjYXBhY2l0eSBpdGVtIiwKICAgICAgIHkgPSAiQ291bnQiLAogICAgICAgeCA9ICJDYXBhY2l0eSIsCiAgICAgICBhbHBoYSA9ICJSZXNwb25zZTogIiwKICAgICAgIGZpbGwgPSAiQ2hhcmFjdGVyOiAiKSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZV9idygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiAgICAgICAgIyBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAjIDIwMDAgYnkgMTIwMAoKZ2dwbG90KGQxX2J5Y29uZDNfbWJfZmFjdG9yc0FsbCAlPiUKICAgICAgICAgIyBmaWx0ZXIob3JkZXIgPD0gMTApICU+JQogICAgICAgICAjIGZpbHRlcihvcmRlciA8PSA1IHwgY2FwV29yZGluZyAlaW4lIGMoImtub3dfd2hhdCdzX25pY2VfYW5kX3doYXQnc19tZWFuIiwKICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWtlX2Nob2ljZXMiKSkgJT4lICMgYWRkIHNlbGVjdGVkIGFnZW5jeSBieSBmYWN0b3IKICAgICAgICAgbXV0YXRlKGZhY2V0ID0gdG9vbHM6OnRvVGl0bGVDYXNlKHBhc3RlMChjaGFyYWN0ZXIsICIgKCIsIGFnZUdyb3VwLCAiKSIpKSksIAogICAgICAgICAjIG11dGF0ZShmYWNldCA9IHRvb2xzOjp0b1RpdGxlQ2FzZShwYXN0ZShhZ2VHcm91cCwgY2hhcmFjdGVyLCBzZXAgPSAiOiAiKSkpLCAKICAgICAgIGFlcyh4ID0gZGVzYyhvcmRlcioyKSwgCiAgICAgICAgICAgZmlsbCA9IGNoYXJhY3RlciwKICAgICAgICAgICBhbHBoYSA9IHJlc3BvbnNlQ2F0LAogICAgICAgICAgICMgZmlsbCA9IHJlc3BvbnNlQ2F0LAogICAgICAgICAgIGxhYmVsID0gZ3N1YigiXyIsICIgIiwgY2FwV29yZGluZykpKSArCiAgZmFjZXRfZ3JpZChmYWN0b3JOYW1lIH4gZmFjZXQsIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXM9YygwLjQsIDAuNywgMSkpICsKICBnZW9tX3RleHQoYWVzKHkgPSA1LCBoanVzdCA9IDApLCAKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAjIGNvbG9yID0gZDFfYnljb25kMl9tYl9mYWN0b3JzQWxsJHRleHRDb2xvciwKICAgICAgICAgICAgc2l6ZSA9IDgpICsKICBsYWJzKHRpdGxlID0gIlJlc3BvbnNlcyBieSBtZW50YWwgY2FwYWNpdHkgaXRlbSIsCiAgICAgICB5ID0gIkNvdW50IiwKICAgICAgIHggPSAiQ2FwYWNpdHkiLAogICAgICAgYWxwaGEgPSAiUmVzcG9uc2U6ICIsCiAgICAgICBmaWxsID0gIkNoYXJhY3RlcjogIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMzIpLAogICAgICAgICMgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIikgIyAyMDAwIGJ5IDEyMDAKCmBgYAoKYGBge3Igc3JjZCBwbG90IHZlcnNpb24gMX0KZF9zcmNkIDwtIGQxX2J5Y29uZDNfbWJfZmFjdG9yc0FsbCAlPiUgCiAgICAgICAgIGZpbHRlcihmYWN0b3IgPT0gIkYxIiwgb3JkZXIgPD0gNSkgJT4lCiAgc2VsZWN0KGFnZUdyb3VwLCBjaGFyYWN0ZXIsIHJlc3BvbnNlQ2F0LCBvcmRlciwgY2FwV29yZGluZykgJT4lCiAgbXV0YXRlKGxhYmVsbGVyID0gaWZlbHNlKHJlc3BvbnNlQ2F0ID09ICJubyIsIGdzdWIoIl8iLCAiICIsIGNhcFdvcmRpbmcpLCBOQSkpICU+JQogIGRpc3RpbmN0KCkKICAKZ2dwbG90KGQxX2J5Y29uZDNfbWJfZmFjdG9yc0FsbCAlPiUgCiAgICAgICAgIGZpbHRlcihmYWN0b3IgPT0gIkYxIiwgb3JkZXIgPD0gNSkgJT4lCiAgICAgICAgIG11dGF0ZShmYWNldCA9IHRvb2xzOjp0b1RpdGxlQ2FzZShwYXN0ZShhZ2VHcm91cCwgY2hhcmFjdGVyLCBzZXAgPSAiOiAiKSkpLAogICAgICAgYWVzKHggPSBkZXNjKG9yZGVyKjIpLCAKICAgICAgICAgICBmaWxsID0gY2hhcmFjdGVyLAogICAgICAgICAgIGFscGhhID0gcmVzcG9uc2VDYXQsCiAgICAgICAgICAgbGFiZWwgPSBnc3ViKCJfIiwgIiAiLCBjYXBXb3JkaW5nKSkpICsKICBmYWNldF9ncmlkKGZhY3Rvck5hbWUgfiBmYWNldCkgKyAjLCBzY2FsZXMgPSAiZnJlZSIsIHNwYWNlID0gImZyZWUiKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAic3RhY2siLCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzPWMoMC4yLCAwLjUsIDEpKSArCiAgIyBzY2FsZV9hbHBoYV9tYW51YWwodmFsdWVzPWMoMC40LCAwLjcsIDEpKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBkX3NyY2QsIAogICAgICAgICAgICBhZXMoeCA9IGRlc2Mob3JkZXIqMiksIGxhYmVsID0gbGFiZWxsZXIsIHkgPSA1KSwKICAgICAgICAgICAgaGp1c3QgPSAwLCBhbmdsZSA9IDkwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSA4LCBhbHBoYSA9IDEpICsKICBsYWJzKHRpdGxlID0gIlJlc3BvbnNlcyBieSBtZW50YWwgY2FwYWNpdHkgaXRlbSIsCiAgICAgICB5ID0gIkNvdW50IiwKICAgICAgIHggPSAiQ2FwYWNpdHkiLAogICAgICAgYWxwaGEgPSAiUmVzcG9uc2U6ICIsCiAgICAgICBmaWxsID0gIkNoYXJhY3RlcjogIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI4KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICMgMTAwMCBieSA1MDAKYGBgCgpgYGB7ciBzcmNkIHBsb3QgdmVyc2lvbiAyfQpkX3NyY2QyIDwtIGQxX2J5Y29uZDNfbWJfZmFjdG9yc0FsbCAlPiUgCiAgICAgICAgIGZpbHRlcihmYWN0b3IgPT0gIkYxIiwgb3JkZXIgPD0gNSwgY2hhcmFjdGVyID09ICJyb2JvdCIpICU+JQogIHNlbGVjdChhZ2VHcm91cCwgY2hhcmFjdGVyLCByZXNwb25zZUNhdCwgb3JkZXIsIGNhcFdvcmRpbmcpICU+JQogIG11dGF0ZShsYWJlbGxlciA9IGlmZWxzZShyZXNwb25zZUNhdCA9PSAibm8iLCBnc3ViKCJfIiwgIiAiLCBjYXBXb3JkaW5nKSwgTkEpKSAlPiUKICBkaXN0aW5jdCgpCiAgCmdncGxvdChkMV9ieWNvbmQzX21iX2ZhY3RvcnNBbGwgJT4lIAogICAgICAgICBmaWx0ZXIoZmFjdG9yID09ICJGMSIsIG9yZGVyIDw9IDUpICU+JQogICAgICAgICBtdXRhdGUoZmFjZXQgPSB0b2xvd2VyKHBhc3RlKGFnZUdyb3VwLCBjaGFyYWN0ZXIsIHNlcCA9ICI6ICIpKSkgJT4lCiAgICAgICAgIG11dGF0ZShmYWNldCA9IGZhY3RvcihmYWNldCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjaGlsZDogYmVldGxlIiwgImNoaWxkOiByb2JvdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWR1bHQ6IGJlZXRsZSIsICJhZHVsdDogcm9ib3QiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNoaWxkcmVuOiBiZWV0bGUiLCAiY2hpbGRyZW46IHJvYm90IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZHVsdHM6IGJlZXRsZSIsICJhZHVsdHM6IHJvYm90IikpKSAlPiUKICAgICAgICAgbXV0YXRlKGFnZUdyb3VwMiA9IGZhY3RvcihhZ2VHcm91cCwgbGV2ZWxzID0gYygiY2hpbGQiLCAiYWR1bHQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJjaGlsZHJlbiIsICJhZHVsdHMiKSkpLAogICAgICAgYWVzKHggPSBkZXNjKG9yZGVyKjIpLCAKICAgICAgICAgICBmaWxsID0gY2hhcmFjdGVyLAogICAgICAgICAgIGFscGhhID0gcmVzcG9uc2VDYXQsCiAgICAgICAgICAgbGFiZWwgPSBnc3ViKCJfIiwgIiAiLCBjYXBXb3JkaW5nKSkpICsKICBmYWNldF9ncmlkKH4gZmFjZXQpICsgIywgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gInN0YWNrIiwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcz1jKDAuMiwgMC41LCAxKSkgKwogICMgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcz1jKDAuNCwgMC43LCAxKSkgKwogIGdlb21fdGV4dChkYXRhID0gZF9zcmNkMiwgCiAgICAgICAgICAgIGFlcyh4ID0gZGVzYyhvcmRlcioyKSwgbGFiZWwgPSBsYWJlbGxlciwgeSA9IDUpLAogICAgICAgICAgICBoanVzdCA9IDAsIGFuZ2xlID0gOTAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDgsIGFscGhhID0gMSkgKwogIGxhYnMoeSA9ICJDb3VudCIsCiAgICAgICB4ID0gIkNhcGFjaXR5IiwKICAgICAgIGFscGhhID0gIlJlc3BvbnNlOiAiLAogICAgICAgZmlsbCA9ICJDaGFyYWN0ZXI6ICIpICsKICBsYWJzKHRpdGxlID0gIlJlc3BvbnNlcyAocmF3IGNvdW50cykiLAogICAgICAgeSA9ICJDb3VudCIsCiAgICAgICB4ID0gIkNhcGFjaXR5IiwKICAgICAgIGFscGhhID0gInJlc3BvbnNlOiAiLAogICAgICAgZmlsbCA9ICJjaGFyYWN0ZXI6ICIpICsKICB0aGVtZV9idygpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyOCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSAjIDEwMDAgYnkgNTAwCgpnZ3Bsb3QoZDFfYnljb25kM19tYl9mYWN0b3JzQWxsICU+JSAKICAgICAgICAgZmlsdGVyKGZhY3RvciA9PSAiRjEiLCBvcmRlciA8PSA1LCBjaGFyYWN0ZXIgPT0gInJvYm90IikgJT4lCiAgICAgICAgIG11dGF0ZShmYWNldCA9IHRvb2xzOjp0b1RpdGxlQ2FzZShwYXN0ZShhZ2VHcm91cCwgY2hhcmFjdGVyLCBzZXAgPSAiOiAiKSkpICU+JQogICAgICAgICBtdXRhdGUoZmFjZXQgPSBmYWN0b3IoZmFjZXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQ2hpbGQ6IFJvYm90IiwgIkFkdWx0OiBSb2JvdCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQ2hpbGRyZW46IHJvYm90IiwgIkFkdWx0czogcm9ib3QiKSkpICU+JQogICAgICAgICBtdXRhdGUoYWdlR3JvdXAyID0gZmFjdG9yKGFnZUdyb3VwLCBsZXZlbHMgPSBjKCJjaGlsZCIsICJhZHVsdCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNoaWxkcmVuIiwgImFkdWx0cyIpKSksCiAgICAgICBhZXMoeCA9IGRlc2Mob3JkZXIqMiksIAogICAgICAgICAgIGFscGhhID0gcmVzcG9uc2VDYXQsCiAgICAgICAgICAgbGFiZWwgPSBnc3ViKCJfIiwgIiAiLCBjYXBXb3JkaW5nKSkpICsKICBmYWNldF9ncmlkKH4gYWdlR3JvdXAyKSArICMsIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICIjMDBCRkM0IikgKwogIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXM9YygwLjIsIDAuNSwgMSkpICsKICAjIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXM9YygwLjQsIDAuNywgMSkpICsKICBnZW9tX3RleHQoZGF0YSA9IGRfc3JjZDIsIAogICAgICAgICAgICBhZXMoeCA9IGRlc2Mob3JkZXIqMiksIGxhYmVsID0gbGFiZWxsZXIsIHkgPSA1KSwKICAgICAgICAgICAgaGp1c3QgPSAwLCBhbmdsZSA9IDkwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSA4LCBhbHBoYSA9IDEpICsKICBsYWJzKHkgPSAiQ291bnQiLAogICAgICAgeCA9ICJDYXBhY2l0eSIsCiAgICAgICBhbHBoYSA9ICJSZXNwb25zZTogIiwKICAgICAgIGZpbGwgPSAiQ2hhcmFjdGVyOiAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgIyA2MDAgYnkgNTAwCmBgYA==